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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值