zoukankan      html  css  js  c++  java
  • 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 };
     
     
     
     
  • 相关阅读:
    Android 调用已安装市场,进行软件评分的功能实现
    二十六个月Android学习工作总结
    Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1) 错误 解决方案(android-ndk)
    【Android】神奇的android:clipChildren属性
    Android利用setLayoutParams在代码中调整布局(Margin和居中)
    android 使用代码实现 RelativeLayout布局
    Android 布局学习
    Erlang cowboy 处理不规范的client
    HTTP 响应
    把字符串转换为整数
  • 原文地址:https://www.cnblogs.com/Tang-tangt/p/8735528.html
Copyright © 2011-2022 走看看