【LeetCode】Binary Tree Preorder Traversal
2014-03-30 14:56
561 查看
题目描述
http://oj.leetcode.com/problems/binary-tree-preorder-traversal/
Binary Tree Preorder Traversal
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?
题目分析
递归方法:这个方法简单,只要按照 自己->
右儿子 ->
左儿子的顺序就可以了
非递归法,开始时根结点在栈中,然后
{
栈顶输弹出
如果有右儿子,右儿子入栈
如果有左儿子,左儿子入栈
}
这样循环,直到栈为空。栈顶一直是下一个要打印的根结点。
总结
这个是在写完后序后写的,就容易多了,尤其在非递归法上,比后序容易多,可以先输入根结点用栈还是比较方便的。
示例代码
/* 编译环境CFree 5.0 */ #include #include #include using namespace std; //#define METHOD 1 //1- 递归法 #define METHOD 2//2- 堆栈方法 /** * Definition for binary tree */ struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} }; void printVector(vector in,char* name) { printf("%s size=%d\n",name,in.size()); for(int i = 0;i< in.size();i++) { printf("%d ",in[i]); } printf("\n"); } #if METHOD == 1 /* 这里对vector的使用方法要得当,把两个vector拼在一起的方法是 把out1,out2,拼成(out1,out2) out2.insert(out2.begin(),out1.begin(),out1.end());//out1,out2顺序不要弄错 */ class Solution { public: vector preorderTraversal(TreeNode *root) {//中左右 vector out; if(root == NULL) return out; vector out1 = preorderTraversal(root->left); vector out2 = preorderTraversal(root->right); out.insert(out.begin(),out2.begin(),out2.end()); //右 out.insert(out.begin(),out1.begin(),out1.end()); //左 out.insert(out.begin(),root->val); //中 return out; } }; #elif METHOD == 2 //堆栈方法 //这个方法不太好理解,需要加以研究 class Solution { public: vector preorderTraversal(TreeNode *root) { vector out; if(root == NULL) return out; //TreeNode *head = root; //就是记录上一个弹出的结点 treenodeStack.push(root); while(!treenodeStack.empty()) { TreeNode *cur = treenodeStack.top();//增加一个记录点 treenodeStack.pop(); out.push_back(cur->val); if(cur->right != NULL) treenodeStack.push(cur->right)/*,printf("lpush = %d\n",cur->right->val)*/; if(cur->left != NULL) treenodeStack.push(cur->left)/*,printf("rpush = %d\n",cur->left->val)*/; } return out; } private: stack treenodeStack; }; #endif /*功能测试*/ void test0() { /* 1 2 3 4 5 6 7 */ TreeNode node1(1); TreeNode node2(2); TreeNode node3(3); TreeNode node4(4); TreeNode node5(5); TreeNode node6(6); TreeNode node7(7); node1.left = &node2; node1.right = &node3; node2.left = &node4; node2.right = &node5; node3.left = &node6; node3.right = &node7; Solution so; vector out = so.preorderTraversal(&node1); //int tmp[7] = {4,5,2,6,7,3,1};后序 int tmp[7] = {1,2,4,5,3,6,7};//先序 int i = 0; for(i = 0;i<7 && i
推荐学习C++的资料
C++标准函数库http://download.csdn.net/detail/chinasnowwolf/7108919
在线C++API查询
http://www.cplusplus.com/
相关文章推荐
- leetcode笔记:Construct Binary Tree from Preorder and Inorder Traversal
- [Leetcode] Construct Binary Tree from Preorder and Inorder Traversal
- 【Leetcode】之Construct Binary Tree from Preorder and Inorder Traversal
- [leetcode] Binary Tree Preorder Traversal 非递归先序遍历
- LeetCode Binary Tree Preorder Traversal (二叉树先序遍历非递归)
- [leetcode]Binary Tree Preorder Traversal
- Leetcode Binary Tree Preorder Traversal 二叉树先序遍历
- leetcode 刷题之路 79 Binary Tree Preorder Traversal
- Binary Tree Preorder Traversal LeetCode OJ
- LeetCode 144:Binary Tree Preorder Traversal
- LeetCode Binary Tree Preorder Traversal
- LeetCode 144 Binary Tree Preorder Traversal(二叉树前序遍历)
- 【C++】【LeetCode】105. Construct Binary Tree from Preorder and Inorder Traversal
- LeetCode题解-105-Construct Binary Tree from Preorder and Inorder Traversal
- LeetCode:Construct Binary Tree from Preorder and Inorder Traversal
- LeetCode105: Construct Binary Tree from Preorder and Inorder Traversal
- Leetcode: Construct Binary Tree from Preorder and Inorder Traversal
- LeetCode之Construct Binary Tree from Preorder and Inorder Traversal
- LeetCode: Construct Binary Tree from Preorder and Inorder Traversal 解题报告
- LeetCode:Binary Tree Preorder Traversal