前序
. - 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/binary-tree-preorder-traversal/description/
1---2---4---5---3---6---7
思想:
中左右
1.先访问左路结点
2.左路结点入栈
3.取栈中结点访问其右子树。
代码:
vector<int> preorderTraversal(TreeNode* root) {//访问一棵树分成两个部分//1.访问左路结点,左路节点入栈//2.取栈中的结点访问其右子树vector<int> v;stack<TreeNode*> st;TreeNode* cur = root;while (cur || !st.empty())//cur||!st.empty(){while (cur){v.push_back(cur->val);//访问左路结点st.push(cur);//左路节点入栈cur = cur->left;}TreeNode* Top = st.top();//取栈中的结点访问其右子树st.pop();cur = Top->right;}return v;
}
中序
. - 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/implement-stack-using-queues/
4---2---5---1---6---3---7
左中右
1.将左路结点全部入栈
2.先访问栈顶节点
3.访问栈顶结点的右子树。
vector<int> inorderTraversal(TreeNode* root)
{vector<int> v;stack<TreeNode*> st;TreeNode* cur = root;while (cur || !st.empty()){while (cur){st.push(cur);cur = cur->left;}TreeNode* Top = st.top();v.push_back(Top->val);st.pop();cur = Top->right;}return v;
}
后序
4---5---2---6---7---3---1
. - 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/binary-tree-postorder-traversal/description/
中左右---中右左---左右中
左右中
1.先访问右路结点
2.右路结点入栈
3.取栈中结点访问其左子树
4.最后将数组反转即可
vector<int> postorderTraversal(TreeNode* root)
{vector<int> v;stack<TreeNode*> st;TreeNode* cur = root;while (cur || !st.empty())//cur||!st.empty(){while (cur){v.push_back(cur->val);//访问右路结点st.push(cur);//右路节点入栈cur = cur->right;}TreeNode* Top = st.top();//取栈中的结点访问其左子树st.pop();cur = Top->left;}reverse(v.begin(),v.end());return v;
}