您的位置:首页 > 其它

【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 二叉树 先序