leetcode-144-Binary Tree Preorder Traversal
来源:互联网 发布:完美汽配软件 编辑:程序博客网 时间:2024/06/06 06:56
#include <iostream>#include <vector>#include <stack>using namespace std;//Definition for a binary tree node.struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {}};/* 非递归实现,先用栈,按先序顺序呢将遍历到的元素push到vector里面,每遇到一个 元素先放到vector,然后检查是否有左儿子,有的话放到vector,然后再检查是否有 右儿子 *///class Solution {//public:// vector<int> preorderTraversal(TreeNode* root) {// stack<TreeNode *> mystack;// vector<int> myvec;// if (root == NULL) {// return myvec;// }// mystack.push(root);// myvec.push_back(root->val);// while (!mystack.empty()) {// TreeNode *cur = mystack.top();// //有左儿子,入栈// if (cur->left) {// mystack.push(cur->left);// myvec.push_back(cur->left->val);// cur->left = NULL;// } else {// //无左儿子,有右儿子// if (cur->right) {// mystack.push(cur->right);// myvec.push_back(cur->right->val);// cur->right = NULL;// } else {// //无左儿子,右儿子// mystack.pop();// }// }// }// return myvec;// }//};/* 看了一个更好的实现,就按顺序的将根,右儿子,左儿子,压进栈,然后出栈的顺序 是跟,左儿子,右儿子,所有根要先出栈,然后在压进右儿子、左儿子。 *///class Solution {//public:// vector<int> preorderTraversal(TreeNode* root) {// stack<TreeNode *> mystack;// vector<int> myvec;// if (root == NULL) {// return myvec;// }// mystack.push(root);// while (!mystack.empty()) {// TreeNode *cur = mystack.top();// mystack.pop();// myvec.push_back(cur->val);// if (cur->right) {// mystack.push(cur->right);// }// if (cur->left) {// mystack.push(cur->left);// }// }// return myvec;// }//};/* morris遍历,只用一个指针遍历即可不用栈,空间为O(1),时间为O(N), 将一颗左子树的最右的节点,指向它的根。在遍历右子树。如果没有左子树 就直接遍历cur,然后访问它的右子树;如果有左子树,就遍历这个节点,然后 访问左子树,并在左子树中寻找以这个节点为根的最后一个叶子节点,并将利用 第一种情况的特点将叶子节点的右儿子连着根,当访问完最后一个节点再访问根 的右子树。 */class Solution {public: vector<int> preorderTraversal(TreeNode* root) { vector<int> myvec; TreeNode *cur = root; while (cur) { if (cur->left == NULL) { myvec.push_back(cur->val); cur = cur->right; } else { TreeNode *prev = cur->left; while (prev->right && prev->right != cur) { prev = prev->right; } if (prev->right == NULL) { myvec.push_back(cur->val); //建立线索后,遍历左子树 prev->right = cur; cur = cur->left; } else { /*去掉线索,恢复树的结构, cur的左子树已全部遍历过了, 遍历右子树 */ prev->right = NULL; cur = cur->right; } } } return myvec; }};int main(int argc, const char * argv[]) { TreeNode one = TreeNode(1); TreeNode two = TreeNode(2); TreeNode three = TreeNode(3); one.right = &two; two.left = &three; Solution s; vector<int> result = s.preorderTraversal(&one); for (int i = 0; i < result.size(); i++) { cout << result[i] << " "; } cout << endl; return 0;}
0 0
- LeetCode(144)Binary Tree Preorder Traversal
- LeetCode: Binary Tree Preorder Traversal [144]
- [leetcode 144]Binary Tree Preorder Traversal
- leetcode || 144、Binary Tree Preorder Traversal
- Binary Tree Preorder Traversal - LeetCode 144
- LeetCode 144 : Binary Tree Preorder Traversal
- LeetCode 144 Binary Tree Preorder Traversal
- LeetCode 144: Binary Tree Preorder Traversal
- Leetcode[144]-Binary Tree Preorder Traversal
- leetcode(144):Binary Tree Preorder Traversal
- Binary Tree Preorder Traversal (leetcode 144)
- leetcode[144]:Binary Tree Preorder Traversal
- [Leetcode 144, Medium] Binary Tree Preorder Traversal
- LeetCode(144) Binary Tree Preorder Traversal
- 【LeetCode】(144)Binary Tree Preorder Traversal(Easy)
- Leetcode #144 Binary Tree Preorder Traversal
- leetcode: (144) Binary Tree Preorder Traversal
- leetCode #144 Binary Tree Preorder Traversal
- Android布局优化 merge标签使用
- 安卓webView实现长按二维码的自动识别功能
- linux下删除mysql
- linux(ubuntu)2台互相ssh无密码访问
- 友元函数与成员函数的一点区别
- leetcode-144-Binary Tree Preorder Traversal
- jQuery源码分析系列
- NIST and Quantum Computers
- Android之SurfaceView学习(一)
- UGUI逐帧动画
- UVA 1220(p282)----Party at Hali-Bula
- go语言指针访问结构体的方法
- leetcode-145-Binary Tree Postorder Traversal
- linux静态库查看方法