Leetcode#144 Binary Tree Preorder Traversal
2015-01-29 10:51
375 查看
原题地址
递归代码谁都会,当然是写非递归代码了。
最基本的写法是用一个特殊栈同时保存节点以及节点的左孩子、右孩子是否遍历过。这种思路比较简单,跟递归写法一样很好理解。前序、中序、后序的遍历写法类似。
还有一种更"屌"的写法,只需要使用普通栈即可,不需要保存左孩子、右孩子是否遍历过。基本思路是:
1. 只要当前节点还有左孩子,就一直压栈下去,直到没有左孩子了
2. 从栈顶依次弹栈,直到找到一个有右孩子的节点,返回1
对于前序和中序,无非是在1中访问节点的值,还是在2中访问节点的值罢了。
对于后序就没法这么做了,不过也有"屌"的写法,可以参考这篇文章。
代码:
递归代码谁都会,当然是写非递归代码了。
最基本的写法是用一个特殊栈同时保存节点以及节点的左孩子、右孩子是否遍历过。这种思路比较简单,跟递归写法一样很好理解。前序、中序、后序的遍历写法类似。
还有一种更"屌"的写法,只需要使用普通栈即可,不需要保存左孩子、右孩子是否遍历过。基本思路是:
1. 只要当前节点还有左孩子,就一直压栈下去,直到没有左孩子了
2. 从栈顶依次弹栈,直到找到一个有右孩子的节点,返回1
对于前序和中序,无非是在1中访问节点的值,还是在2中访问节点的值罢了。
对于后序就没法这么做了,不过也有"屌"的写法,可以参考这篇文章。
代码:
vector<int> preorderTraversal(TreeNode *root) { vector<int> res; stack<TreeNode *> st; TreeNode *node = NULL; node = root; while (node) { while (node) { res.push_back(node->val); st.push(node); node = node->left; } node = NULL; while (!st.empty() && !node) { node = st.top()->right; st.pop(); } } return res; }
相关文章推荐
- 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
- LeetCode144:Binary Tree Preorder Traversal
- LeetCode 144: Binary Tree Preorder Traversal 解题与思考
- [leetcode-144]Binary Tree Preorder Traversal(c++)
- <LeetCode OJ>Binary Tree Preorder Traversal【144】
- Java [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
- [leetcode 144]Binary Tree Preorder Traversal
- LeetCode(144):Binary Tree Preorder Traversal
- [leetcode144]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