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++标准函数库
在线C++API查询