• Binary Tree Inorder Traversal


    题目:

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

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

       1
        
         2
        /
       3
    

    return [1,3,2].

    Note: Recursive solution is trivial, could you do it iteratively?

    confused what "{1,#,2,3}" means? > read more on how binary tree is serialized on OJ.

     

    解析:

     递归:

     1 class Solution {
     2 public:
     3     vector<int> inorderTraversal(TreeNode* root) {
     4         vector<int> v;
     5         inTraversal(root,v);
     6         return v;
     7     }
     8     
     9     void inTraversal(TreeNode* root,vector<int>& v)
    10     {
    11         if(!root) return;
    12         inTraversal(root->left,v);
    13         v.push_back(root->val);
    14         inTraversal(root->right,v);
    15     }
    16 };

     栈非递归

     1 class Solution
     2 {
     3 public:
     4     vector<int> inorderTraversal(TreeNode* root)
     5     {
     6         vector<int> v;
     7         if(!root) return v;
     8         TreeNode* temp = root;
     9         stack<TreeNode*> s;
    10         while(true)
    11         {
    12             while(temp)
    13             {
    14                 s.push(temp);
    15                 temp = temp->left;
    16             }
    17             if(s.empty()) break;
    18             temp = s.top();
    19             s.pop();
    20             v.push_back(temp->val);
    21             temp = temp->right;
    22         }
    23         return v;
    24     }
    25 };

    不用栈:

     1 // iterate, morris traversal, without stack
     2 vector<int> inorderTraversal(TreeNode* root) {
     3     vector<int> v;
     4     if(!root) return v;
     5     TreeNode* temp = root, *prev;
     6     while(temp){
     7         if(!temp->left){
     8             v.push_back(temp->val);
     9             temp = temp->right;
    10         }else{
    11             prev = temp->left;
    12             while(prev->right&&(prev->right != temp))
    13                 prev = prev->right;
    14             if(!prev->right){
    15                 prev->right = temp;
    16                 temp = temp->left;
    17             }else{
    18                 v.push_back(temp->val);
    19                 prev->right = NULL;
    20                 temp = temp->right;
    21             }
    22         }
    23     }
    24 }
  • 相关阅读:
    Linux与Mac通信
    练习
    删除重复文件
    解压压缩文件
    查询压缩文件的大小
    修改文件夹和文件名字
    删除文件和文件夹
    移动文件和文件夹
    shutil复制文件夹
    shutil复制文件
  • 原文地址:https://www.cnblogs.com/raichen/p/4950056.html
Copyright © 2020-2023  润新知