二叉树( C++ )
遍历
递归
#include<bits/stdc++.h> using namespace std; // 结构体 struct TreeNode { int val; TreeNode *left; TreeNode *right; // 构造函数 // TreeNode(int x):val(x), left(nullptr), right(nullptr) {} TreeNode(int x) { val = x; left = nullptr; right = nullptr; } }; // 中序遍历 void traversal(TreeNode *cur, vector<int> &vec) { if (cur == nullptr) return; traversal(cur->left, vec); // 左 vec.push_back(cur->val); // 中 traversal(cur->right, vec); // 右 } int main() { // 创建树 TreeNode *root = new TreeNode(1); root->left = new TreeNode(2); root->right = new TreeNode(3); root->left->left = new TreeNode(4); root->left->right = new TreeNode(5); vector<int> result; traversal(root,result); /* 1 / 2 3 / 4 5 */ // 遍历 root for(int num: result) { cout << " " << num <<" "; // 4 2 5 1 3 } // 释放 资源 delete root->left->left; delete root->left->right; delete root->left; delete root->right; delete root; return 0; }
迭代法(栈)
#include<bits/stdc++.h> using namespace std; // 结构体 struct TreeNode { int val; TreeNode *left; TreeNode *right; // 构造函数 // TreeNode(int x):val(x), left(nullptr), right(nullptr) {} TreeNode(int x) { val = x; left = nullptr; right = nullptr; } }; // 前序遍历 void preorderTraversal(TreeNode *root,vector<int> &vec) { // 出栈 判断是否有左右分支 如果有就是左右分支入栈 ( 先入 右边 再入 左边 ) stack<TreeNode*> st; if(root == nullptr) { return; } st.push(root); while (!st.empty()) { TreeNode* node = st.top(); st.pop(); // 出栈 vec.push_back(node->val); // 保存 if(node->right != nullptr ) { st.push(node->right); } if(node->left) { st.push(node->left); } } } // 中序遍历 void inorderTraversal(TreeNode *root,vector<int> &vec) { stack<TreeNode*> st; TreeNode* cur = root; while(cur != nullptr || !st.empty()) { if(cur != nullptr) { st.push(cur); cur = cur->left; } // 到达最左边 else { // 出栈 cur = st.top(); st.pop(); vec.push_back(cur->val); cur = cur->right; } } } // 后序遍历 int main() { // 创建树 TreeNode *root = new TreeNode(1); root->left = new TreeNode(2); root->right = new TreeNode(3); root->left->left = new TreeNode(4); root->left->right = new TreeNode(5); vector<int> result; preorderTraversal(root,result); // 打印 for(int num: result) { cout << " " << num <<" "; // 4 2 5 1 3 } // 释放 资源 delete root->left->left; delete root->left->right; delete root->left; delete root->right; delete root; return 0; }
最大深度
#include<bits/stdc++.h> using namespace std; // 结构体 struct TreeNode { int val; TreeNode* left; TreeNode* right; // 构造器 TreeNode(int x) { val = x; left = nullptr; right = nullptr; } }; int result; // 表示数的高度 // 计算树木的深度 通过前序遍历完成 void TreeDepth(TreeNode* node,int depth) { // 中间 比较 if(result < depth) { result = depth; } // 终止条件 if(node->left == nullptr && node->right == nullptr) { return; } // 左边 if(node->left) { depth++; // 左边 TreeDepth(node->left,depth); depth--; } // 右边 if(node->right) { depth++; // 左边 TreeDepth(node->right,depth); depth--; } return; } // 计算数最大深度 int getdepth(TreeNode* node) { if(node == nullptr) { return 0; } // 后序遍历 左右中 // 左 int leftheight = getdepth(node->left); // 右边 int rightheight = getdepth(node->right); // 中间 int res = 1 + max(leftheight, rightheight); return res; // 注意这里 res 可能会赋值给 leftheight 或者 rightheight } /* 1 / 2 3 / 4 5 */ int main() { // 创建树 TreeNode *root = new TreeNode(1); root->left = new TreeNode(2); root->right = new TreeNode(3); root->left->left = new TreeNode(4); root->left->right = new TreeNode(5); // 计算树的深度 result = 0; if(root == nullptr) { return result; } // 调用函数 TreeDepth(root, 1); cout<< result<<endl; int res = getdepth(root); cout<< res<<endl; // 释放 资源 delete root->left->left; delete root->left->right; delete root->left; delete root->right; delete root; return 0; }