• 66 二叉树的前序遍历


    原题网址: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 };
     
     
     
     
  • 相关阅读:
    10.11-10.16
    10.8-10.10
    9.26-28
    9.29css继承属性
    表单的学习
    排版
    css补充
    今天学的新内容
    新内容
    文本样式的修改
  • 原文地址:https://www.cnblogs.com/Tang-tangt/p/8735528.html
Copyright © 2020-2023  润新知