[LeetCode][94,144,145]Binary Tree (Pre/In/Post)order Traversal
来源:互联网 发布:域名续费多少钱 编辑:程序博客网 时间:2024/06/02 03:44
Description:
Given a binary tree, return the (Pre/In/Post)order traversal of its nodes' values.
For example:
Given binary tree [1,null,2,3]
,
1 \ 2 / 3
return [1,2,3]
. for Preorder.
return [1,3,2]
. for Inorder.
return [3,2,1]
. for Postorder.
Note: Recursive solution is trivial, could you do it iteratively?
———————————————————————————————————————————————————
Solution:
经典问题:使用非递归方法对二叉树进行先序、中序、后序遍历。
思路:都需要借助数据结构——栈(Stack)来实现。根据每个遍历的特性:先序遍历先输出根节点,然后左子树,最后右子树;中序遍历先输出左子树,然后根节点,最后右子树;后序遍历先输出左子树,然后右子树,最后根节点;我们可以得到代码设计的主要思路。
其中一些细节值得关注的是:
1.先序遍历和中序遍历算法相差无几,只在何时输出根有所变化,而且它们都没有将根重新压回栈中;
2.后序遍历相对麻烦,在不修改二叉树节点结构,或消耗大量空间的前提下,需要一个记录上一次访问节点的指针,这个指针是在判断是否应该输出根时使用,若根的右孩子存在而且指针没有指向这个右孩子,则需要将根重新压入栈中;若这个指针指向了根的右孩子或者根的右孩子不存在,则说明已经访问过右孩子了或者不需要访问,则此时应该输出根而不应该重新压入栈中,而且应该更新记录指针指向当前根节点。
以上就是使用非递归方法遍历二叉树的关键点。
先序:
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public: vector<int> preorderTraversal(TreeNode* root) { vector<int> preOrder; if (root == NULL) return preOrder; stack<TreeNode*> s; TreeNode* temp = root; while (!s.empty() || temp) { if (temp) { preOrder.push_back(temp->val); s.push(temp); temp = temp->left; } else { temp = s.top(); s.pop(); temp = temp->right; } } return preOrder; }};
中序:
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public: vector<int> inorderTraversal(TreeNode* root) { vector<int> inOrder; if (root == NULL) return inOrder; stack<TreeNode*> s; TreeNode* temp = root; while (!s.empty() || temp) { if (temp) { s.push(temp); temp = temp->left; } else { temp = s.top(); s.pop(); inOrder.push_back(temp->val); temp = temp->right; } } return inOrder; }};
后序:
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public: vector<int> postorderTraversal(TreeNode* root) { vector<int> postOrder; if (root == NULL) return postOrder; stack<TreeNode*> s; // 记录上一个输出的根节点 TreeNode* lastNode = NULL; TreeNode* temp = root; while (temp) { s.push(temp); temp = temp->left; } while (!s.empty()) { temp = s.top(); s.pop(); // 右子树为空 或 已访问完右子树 if (temp->right == NULL || temp->right == lastNode) { postOrder.push_back(temp->val); lastNode = temp; } else { s.push(temp); temp = temp->right; while (temp) { s.push(temp); temp = temp->left; } } } return postOrder; }};
- <LeetCode OJ> 144 / 145 / 94 Binary Tree (Pre & In & Post) order Traversal
- [LeetCode][94,144,145]Binary Tree (Pre/In/Post)order Traversal
- [LeetCode] Construct/build binary tree from in-order and post-order/pre-order traversal
- Pre-order,in-order, post-order of Tree Traversal
- [LeetCode][105,106] Construct Binary Tree from Inorder and (Post/Pre)order Traversal
- LeetCode: Binary Tree Inorder Traversal, Morris In Order Traversal
- LeetCode刷题笔录Binary Tree Post Order Traversal
- In sum for pre- / In- and Post- order Traversal
- LeetCode[Tree]: Binary Tree Level Order Traversal
- *(leetcode) Binary Tree Level Order Traversal (tree)
- [leetcode][tree] Binary Tree Level Order Traversal
- LeetCode: Binary Tree Level Order Traversal
- LeetCode: Binary Tree Zigzag Level Order Traversal
- LeetCode: Binary Tree Level Order Traversal II
- [LeetCode]Binary Tree Level Order Traversal
- [LeetCode]Binary Tree Level Order Traversal II
- [LeetCode]Binary Tree Zigzag Level Order Traversal
- LeetCode Binary Tree Level Order Traversal
- 关于GitHub
- 麦克纳姆轮及其速度分解计算
- Tomcat 服务器 Session的实现
- POJ 1932 XYZZY (差分约束+最长路)
- win10下安装并测试apache服务器
- [LeetCode][94,144,145]Binary Tree (Pre/In/Post)order Traversal
- 单片机控制TFT液晶屏显示数字
- Linux下记录所有用户操作的脚本
- python3读取解析邮件内容
- UVa 10118 Free Candies 记忆化搜索
- 网络应用的需求与传输层服务
- scalikeJDBC
- 微信公众号开发--关注后自动回复(Java记录篇)
- Androidstudio快捷键的使用