LeetCode Binary Tree Preorder Traversal 前序遍历二叉树 递归和非递归解法
2013-11-07 10:42
597 查看
Binary Tree Preorder Traversal
Given a binary tree, return the preorder traversal of its nodes' values.
For example:
Given binary tree
return
Note: Recursive solution is trivial, could you do it iteratively?
2014-1-10 update:
先序遍历的非递归也是非常简单的:
的确如note说的一样,使用递归只需要几分钟就解决了,如果不是用递归,自己琢磨的话还是花了差不多半个小时。
看代码就知道非递归比递归长很多。
非递归方法主要难点:
1. 需要使用两个循环,左子树循环嵌套右子树循环;
2. 有右子树的时候,需要跳出本循环,让其重新进入左子树循环。
2. 无左子树的时候,需要出栈,而不是等到空子树才出栈。
下面使用两种方法解决一下这个题目,他们的时间效率都差不多,都是12ms,大概测试数据都很少,所以时间都一样。也是LeetCode上的一个水题了,测试数据都不多。
主函数都是一样的:
递归法:
非递归法:
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?
2014-1-10 update:
先序遍历的非递归也是非常简单的:
vector<int> preorderTraversal(TreeNode *root) { vector<int> rs; if (!root) return rs; stack<TreeNode *> stk; stk.push(root); while (!stk.empty()) { TreeNode *t = stk.top(); stk.pop(); rs.push_back(t->val); if (t->right) stk.push(t->right); if (t->left) stk.push(t->left); } return rs; }
的确如note说的一样,使用递归只需要几分钟就解决了,如果不是用递归,自己琢磨的话还是花了差不多半个小时。
看代码就知道非递归比递归长很多。
非递归方法主要难点:
1. 需要使用两个循环,左子树循环嵌套右子树循环;
2. 有右子树的时候,需要跳出本循环,让其重新进入左子树循环。
2. 无左子树的时候,需要出栈,而不是等到空子树才出栈。
下面使用两种方法解决一下这个题目,他们的时间效率都差不多,都是12ms,大概测试数据都很少,所以时间都一样。也是LeetCode上的一个水题了,测试数据都不多。
主函数都是一样的:
vector<int> preorderTraversal(TreeNode *root) { vector<int> prePath; preStack(root, prePath); return prePath; }
递归法:
void preNodes(TreeNode *node,vector<int> &onePath) { if(node == nullptr) return; onePath.push_back(node->val); preNodes(node->left, onePath); preNodes(node->right, onePath); }
非递归法:
void preStack(TreeNode *node, vector<int> &prePath) { if(node == nullptr) return; stack<TreeNode *> stk; TreeNode *cur = node; stk.push(cur); while (!stk.empty()) { cur = stk.top(); prePath.push_back(cur->val); while (cur->left) { prePath.push_back(cur->left->val); cur = cur->left; stk.push(cur); } stk.pop(); while (!stk.empty() || cur->right) { if(cur->right) { cur = cur->right; stk.push(cur); break; } else { cur = stk.top(); stk.pop(); } }//while }//while }
//2014-2-19 update vector<int> preorderTraversal(TreeNode *root) { vector<int> rs; if (!root) return rs; stack<TreeNode *> stk; stk.push(root); while (!stk.empty()) { TreeNode *t = stk.top(); stk.pop(); rs.push_back(t->val); if (t->right) stk.push(t->right); if (t->left) stk.push(t->left); } return rs; }
相关文章推荐
- LeetCode:Binary Tree Preorder Traversal(非递归方法前序遍历二叉树)
- LeetCode:105_Construct Binary Tree from Preorder and Inorder Traversal | 根据前序和中序遍历构建二叉树 | Medium
- LeetCode:144_Binary Tree Preorder Traversal | 二叉树的前序遍历 | Medium
- leetcode--第5章--树-5.1二叉树的遍历--5.1.1 binary tree preorder traversal
- 【遍历二叉树】01二叉树的前序遍历【Binary Tree Preorder Traversal】
- LeetCode-Construct Binary Tree from Preorder and Inorder Traversal-前序中序恢复二叉树-递归
- LeetCode-105:Construct Binary Tree from Preorder and Inorder Traversal (利用先序和中序遍历构建二叉树) -- medium
- LeetCode 105. Construct Binary Tree from Preorder and Inorder Traversal (用先序和中序树遍历来建立二叉树)
- LeetCode OJ:Binary Tree Preorder Traversal(前序遍历二叉树)
- leetcode_144题——Binary Tree Preorder Traversal(二叉树,递归,栈的使用)
- [LeetCode] 105. Construct Binary Tree from Preorder and Inorder Traversal 由先序和中序遍历建立二叉树
- 【leetcode】非递归先序遍历二叉树(Binary Tree Preorder Traversal)
- LeetCode Binary Tree Postorder Traversal(二叉树的后序遍历 非递归实现)
- LeetCode(Construct Binary Tree from Preorder and Inorder Traversal )根据二叉树的中序遍历和后序遍历重建二叉树
- lintcode 容易题:Binary Tree Preorder Traversal 二叉树的前序遍历
- 144. Binary Tree Preorder Traversal 二叉树的前序遍历
- 【LeetCode 144_二叉树_遍历】Binary Tree Preorder Traversal
- Leetcode 105. Construct Binary Tree from Preorder and Inorder Traversal 先序和中序中恢复二叉树 解题报告
- LeetCode 144 Binary Tree Preorder Traversal (先序遍历二叉树)
- [leetcode-二叉树层次遍历并统计每层节点数]--102. Binary Tree Level Order Traversal