二叉树的前序遍历
递归遍历法
class Solution { public: void traversal(TreeNode* cur, vector<int>& result){ if(cur == NULL) return; //当前节点为空,终止递归过程 result.push_back(cur->val); //存储当前节点值 traversal(cur->left,result); //前序遍历,中左右,先递归左孩子节点 traversal(cur->right,result); } vector<int> preorderTraversal(TreeNode* root) { vector<int> result; traversal(root, result); return result; } };
迭代法
class Solution { public: vector<int> preorderTraversal(TreeNode* root) { stack<TreeNode*> st; vector<int> result; if (root == NULL) return result; st.push(root); //根节点入栈 while(!st.empty()){ TreeNode* node = st.top();//node为此时的栈顶,因为先入栈的是右节点,后入栈的左结点,所以top为左结点,遵循中左右 st.pop(); result.push_back(node->val); //前序中左右,中结点值入栈 if(node->right) st.push(node->right);//右,因为栈输出倒序,右结点值入栈 if(node->left) st.push(node->left);//左 } return result; } };
具体思想写在备注。主要理解二叉树遍历顺序和迭代,递归条件的关系
二叉树的后序遍历
递归遍历法
class Solution { public: void traversal(TreeNode* cur, vector<int>& result){ if(cur == NULL) return; //当前节点为空,终止递归过程 traversal(cur->left,result); //左 前序遍历,中左右,先递归左孩子节点 traversal(cur->right,result); //右 result.push_back(cur->val); //中 存储当前节点值,当前顺序为中 } vector<int> postorderTraversal(TreeNode* root) { vector<int> result; traversal(root, result); return result; } };
迭代法
class Solution { public: vector<int> postorderTraversal(TreeNode* root) { stack<TreeNode*> st; vector<int> result; if (root == NULL) return result; st.push(root); while(!st.empty()){ TreeNode* node = st.top(); st.pop(); result.push_back(node->val); //中值先入result if (node->left) st.push(node->left); // 相对于前序遍历,这更改一下入栈顺序 if (node->right) st.push(node->right); // 空节点不入栈 //现在栈中顺序为 中 右 左 } reverse(result.begin(), result.end()); //反转顺序变为 左 右 中 return result; } };
二叉树的中序遍历
class Solution { public: void traversal(TreeNode* cur, vector<int>& result){ if(cur == NULL) return; //当前节点为空,终止递归过程 traversal(cur->left,result); //左 前序遍历,中左右,先递归左孩子节点 result.push_back(cur->val); //中 存储当前节点值,当前顺序为中 traversal(cur->right,result); //右 } vector<int> inorderTraversal(TreeNode* root) { vector<int> result; traversal(root, result); return result; } };
迭代法
class Solution { public: vector<int> inorderTraversal(TreeNode* root) { vector<int> result; stack<TreeNode*> st; TreeNode* cur = root; while (cur != NULL || !st.empty()) { if(cur != NULL){ st.push(cur); cur = cur->left;//向左遍历到最底层,节点入栈 }else{ cur = st.top(); //指向栈顶,底层节点 st.pop(); result.push_back(cur->val); //出栈元素就是遍历值 cur = cur->right; //为空遍历右结点 } } return result; } };
标签:node,cur,Day30,st,vector,result,root,LeetCode,刷题 From: https://www.cnblogs.com/tianmaster/p/16948635.html