<LeetCode OJ> 144 / 145 / 94 Binary Tree (Pre & In & Post) order Traversal
来源:互联网 发布:php mongodb扩展 编辑:程序博客网 时间:2024/06/06 10:54
Given a binary tree, return the preorder traversal of its nodes' values.
For example:
Given binary tree {1,#,2,3}
,
1 \ 2 / 3
return [1,2,3]
.
Note: Recursive solution is trivial, could you do it iteratively?
1,前序遍历:
递归解法:
基本规则,总是先访问根节点在左节点,在右节点
class Solution {public: vector<int> result; vector<int> preorderTraversal(TreeNode* root) { if(root){ result.push_back(root->val); preorderTraversal(root->left); preorderTraversal(root->right); } return result; }};
迭代解法:
class Solution {public: vector<int> preorderTraversal(TreeNode* root) { if (root==NULL) return result; stack<TreeNode*> stk; TreeNode* pCurNode=root; stk.push(pCurNode); while (!stk.empty()) { pCurNode = stk.top(); stk.pop(); result.push_back(pCurNode->val); if (pCurNode->right) stk.push(pCurNode->right); //后压进来的后访问 if (pCurNode->left) stk.push(pCurNode->left); } return result; }private: vector<int> result; };
Given a binary tree, return the inorder traversal of its nodes' values.
For example:
Given binary tree {1,#,2,3}
,
1 \ 2 / 3
return [1,3,2]
.
Note: Recursive solution is trivial, could you do it iteratively?
confused what "{1,#,2,3}"
means? > read more on how binary tree is serialized on OJ.
2,中序遍历:
递归解法:
总是遍历树的左子,再当前节点,再右子
class Solution { public: vector<int> inorderTraversal(TreeNode* root) { if(root){ inorderTraversal(root->left); result.push_back(root->val); inorderTraversal(root->right); } return result; } private: vector<int> result; };
迭代解法:
class Solution { public: vector<int> inorderTraversal(TreeNode* root) { if (root==NULL) return result; stack<TreeNode*> stk; TreeNode* pCurNode=root; while (!stk.empty() ||pCurNode) { while(pCurNode)//先把当前节点的所有左子压进去, { stk.push(pCurNode); pCurNode=pCurNode->left; } pCurNode=stk.top(); stk.pop();//访问当前节点 result.push_back(pCurNode->val); pCurNode=pCurNode->right;//再访问当前节点的右子树 } return result; } private: vector<int> result; };
综上述:都可以采用栈来实现。将当前节点,左子,右子压进栈的顺序以及访问后的弹出栈形成的访问顺序,目的就是在维护要求的遍历顺序。
Given a binary tree, return the postorder traversal of its nodes' values.
For example:
Given binary tree {1,#,2,3}
,
1 \ 2 / 3
return [3,2,1]
.
Note: Recursive solution is trivial, could you do it iteratively?
3,后序遍历:
总是先访问左子,再右子,最后当前节点
递归解法:
class Solution {public: vector<int> postorderTraversal(TreeNode* root) { if(root!=NULL) { postorderTraversal(root->left); postorderTraversal(root->right); result.push_back(root->val); } return result; }private: vector<int> result; };
迭代解法
然而发现回顾了一下也没用,尼玛,尽然要用两个栈或者用到了前后节点来维护。
别人的算法设计:
输出栈:获取最终的输出结果
辅助栈:
1,利用辅助栈总是先将当前节点压进栈,接着弹给输出栈(此时他的顺序已确定,所以最先进输出栈,因为最后访问),
2,再左子进辅助栈,在右子进辅助栈(此时在栈顶,下次循环他已被确定顺序)
class Solution {public: vector<int> postorderTraversal(TreeNode* root) { if (root==NULL) return result; stack<TreeNode*> outStk;//辅助栈将维护此栈的顺序就是后序遍历的顺序 stack<TreeNode*> assistStk;//辅助栈 TreeNode *pCurNode = root; assistStk.push(pCurNode); while (!assistStk.empty()) { pCurNode = assistStk.top(); assistStk.pop(); outStk.push(pCurNode); if (pCurNode->left!=NULL) assistStk.push(pCurNode->left); if (pCurNode->right!=NULL) assistStk.push(pCurNode->right); } while (!outStk.empty()) { result.push_back(outStk.top()->val); outStk.pop(); } return result; }private: vector<int> result; };
注:本博文为EbowTang原创,后续可能继续更新本文。如果转载,请务必复制本条信息!
原文地址:http://blog.csdn.net/ebowtang/article/details/50572826
原作者博客:http://blog.csdn.net/ebowtang
- <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 OJ:Binary Tree Level Order Traversal
- LeetCode OJ - Binary Tree Level Order Traversal
- LeetCode OJ Binary Tree Level Order Traversal
- LeetCode: Binary Tree Inorder Traversal, Morris In Order Traversal
- LeetCode OJ:Binary Tree Level Order Traversal II
- LeetCode OJ:Binary Tree Zigzag Level Order Traversal
- LeetCode OJ - Binary Tree Zigzag Level Order Traversal
- LeetCode OJ Binary Tree Zigzag Level Order Traversal
- LeetCode OJ Binary Tree Level Order Traversal II
- leetcode OJ java Binary Tree Level Order Traversal
- <LeetCode OJ> 103. Binary Tree Zigzag Level Order Traversal
- Leetcode OJ 102 Binary Tree Level Order Traversal [Medium]
- LeetCode刷题笔录Binary Tree Post Order Traversal
- android之桌面悬浮框
- LeetCode 160 Intersection of Two Linked Lists(链表相交)(Linked List)(*)
- POJ 1837 二维背包 天平平衡问题
- SQL之模糊查询
- Codeforces Round #340 (Div. 2):A. Elephant
- <LeetCode OJ> 144 / 145 / 94 Binary Tree (Pre & In & Post) order Traversal
- CF 10C Digital Root
- 3450: Tyvj1952 Easy 概率与期望 DP
- 面试题
- Leetcode Array题型总结
- 猴子分桃
- 读《钝感力》有感
- Codeforces Round #340 (Div. 2):B. Chocolate
- NCrawler 开源爬虫框架学习