zoukankan      html  css  js  c++  java
  • LeetCode Binary Tree Inorder Traversal

    Given a binary tree, return the inorder traversal of its nodes' values.

    For example:
    Given binary tree {1,#,2,3},

    非递归版本:

    用一个栈来模拟递归的情况,

    首先思考inorder traverse的递归函数

    traverse(left tree);

    visit current node

    traverse(right tree);

    也就是说我们把一个节点压入栈中,首先它会先递归访问左子树(左节点入栈),再访问本身(这个时候这个节点就可以出栈了),在访问右子树(右节点入栈)。

    最后我们定义一个数据结构

    1 struct Node
    2 {
    3     TreeNode *tNode;
    4     bool findLeft;
    5     Node(){}
    6     Node(TreeNode *n):tNode(n), findLeft(false){}
    7 };

    其中findLeft是判断是否已将左节点入栈了

     1 /**
     2  * Definition for binary tree
     3  * struct TreeNode {
     4  *     int val;
     5  *     TreeNode *left;
     6  *     TreeNode *right;
     7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     8  * };
     9  */
    10 struct Node
    11 {
    12     TreeNode *tNode;
    13     bool findLeft;
    14     Node(){}
    15     Node(TreeNode *n):tNode(n), findLeft(false){}
    16 };
    17 
    18 class Solution {
    19 private:
    20     vector<int> ret;
    21 public:
    22     vector<int> inorderTraversal(TreeNode *root) {
    23         // Start typing your C/C++ solution below
    24         // DO NOT write int main() function
    25         stack<Node> s;
    26         s.push(Node(root, false));
    27         ret.clear();
    28         
    29         while(!s.empty())
    30         {
    31             Node node = s.top();
    32             if (node.tNode == NULL)
    33                 s.pop();
    34             else
    35             {
    36                 if (!node.findLeft)
    37                 {
    38                     s.pop();
    39                     s.push(Node(node.tNode, true));
    40                     s.push(Node(node.tNode->left, false));
    41                 }
    42                 else
    43                 {
    44                     s.pop();
    45                     ret.push_back(node.tNode->val);
    46                     s.push(Node(node.tNode->right, false));
    47                 }
    48             }
    49         }
    50         
    51         return ret;
    52     }
    53 };

    递归版本:

     1 /**
     2  * Definition for binary tree
     3  * struct TreeNode {
     4  *     int val;
     5  *     TreeNode *left;
     6  *     TreeNode *right;
     7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     8  * };
     9  */
    10 class Solution {
    11 private:
    12     stack<TreeNode* > s;
    13     vector<int> ret;
    14 public:
    15     vector<int> inorderTraversal(TreeNode *root) {
    16         // Start typing your C/C++ solution below
    17         // DO NOT write int main() function
    18         ret.clear();
    19         if (root == NULL)
    20             return ret;
    21             
    22         s.push(root);
    23         TreeNode *node = root;
    24         while(!s.empty())
    25         {
    26             node = node->left;
    27             s.push(node);
    28         }
    29     }
    30 };
  • 相关阅读:
    Lookup 组件用法全解
    将字符串转换成表
    处于同一域中的两台SQL Server 实例无法连接
    在SSIS中的不同组件间使用局部临时表
    SSIS的CheckPoint用法
    控制流如何处理错误
    SSIS 对数据排序
    SSIS 数据输出列因为字符截断而失败
    SQL Server 的本地时间和UTC时间
    TSQL Merge 用法
  • 原文地址:https://www.cnblogs.com/chkkch/p/2742942.html
Copyright © 2011-2022 走看看