66 二叉树的前序遍历

时间:2022-05-20 11:26:34

原题网址:http://www.lintcode.com/zh-cn/problem/binary-tree-preorder-traversal/

给出一棵二叉树,返回其节点值的前序遍历。

样例

给出一棵二叉树 {1,#,2,3},

   1
    \
     2
    /
   3

 返回 [1,2,3].

挑战 

你能使用非递归实现么?

标签 
 
方法一:递归……依旧是在函数外定义类成员作为函数返回值。
 1 /**
 2  * Definition of TreeNode:
 3  * class TreeNode {
 4  * public:
 5  *     int val;
 6  *     TreeNode *left, *right;
 7  *     TreeNode(int val) {
 8  *         this->val = val;
 9  *         this->left = this->right = NULL;
10  *     }
11  * }
12  */
13 
14 class Solution {
15 public:
16     /**
17      * @param root: A Tree
18      * @return: Preorder in ArrayList which contains node values.
19      */
20      vector<int> result;
21     vector<int> preorderTraversal(TreeNode * root) {
22         // write your code here
23         if (root!=NULL)
24     {
25         result.push_back(root->val);
26         preorderTraversal(root->left);
27         preorderTraversal(root->right);
28     }
29     return result;
30     }
31 };

方法二:非递归,让我吐血一会……

参考:https://blog.csdn.net/hk_john/article/details/69424907

          https://blog.csdn.net/chan15/article/details/48831813

          C++中stack的用法

简单说几句,前序遍历即根左右,非递归的话使用移动指针指向根节点,先判断根节点是否为NULL,不为NULL就将val值push到结果数组中;

然后是左,左可能是子树,遍历子树依旧遵循根左右原则,所以要用循环的方式将左节点赋值给移动指针;

再然后是右,我靠右怎么办啊,移动指针已经指向左了!淡定,这时候可以使用额外空间存储右的根节点或者右节点本身,这个额外空间是stack或是vector就任君挑选了,反正利用的都是栈结构先进后出的思想。当遍历左节点直至叶子结点并且这个额外空间不为空时,取出右节点赋值给移动指针继续遍历。

 

代码:

刚开始没有加else break;导致死循环,面壁……每次碰到while循环且条件判断中的量在循环体中不断变化时就容易死循环,咋不长记性呢

 1 /**
 2  * Definition of TreeNode:
 3  * class TreeNode {
 4  * public:
 5  *     int val;
 6  *     TreeNode *left, *right;
 7  *     TreeNode(int val) {
 8  *         this->val = val;
 9  *         this->left = this->right = NULL;
10  *     }
11  * }
12  */
13 
14 class Solution {
15 public:
16     /**
17      * @param root: A Tree
18      * @return: Preorder in ArrayList which contains node values.
19      */
20     vector<int> preorderTraversal(TreeNode * root) {
21         // write your code here
22         vector<int> result;
23     TreeNode *p=root;
24     stack<TreeNode *> s;
25 
26     while (p!=NULL)  //while (p!=NULL)循环结束,p是否可能为NULL?;
27     {                         //如果不为NULL,如何结束循环?;
28         result.push_back(p->val);
29         if (p->right!=NULL)
30         {
31             s.push(p);
32         }
33         if (p->left!=NULL)
34         {
35             p=p->left;
36         }
37         else if (s.empty()!=true)
38         {
39             p=s.top()->right; //p=s.top()取的是根节点;
40             s.pop();
41         }
42         else
43         {
44             break;
45         }
46     }
47     return result;
48     }
49 };