zoukankan      html  css  js  c++  java
  • 【Binary Tree Inorder Traversal】cpp

    题目:

    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?

    代码:

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    public:
        vector<int> inorderTraversal(TreeNode* root) {
                vector<int> ret;
                if ( !root ) return ret;
                stack<TreeNode*> sta;
                sta.push(root);
                while ( !sta.empty() )
                {
                    TreeNode *tmp = sta.top();
                    sta.pop();
                    if ( tmp->right ) sta.push(tmp->right);
                    if ( tmp->left ){
                        TreeNode *tmp_left = tmp->left;
                        tmp->left = NULL;
                        tmp->right = NULL;
                        sta.push(tmp);
                        sta.push(tmp_left);
                    }
                    else{
                        ret.push_back(tmp->val);
                    } 
                }
                return ret;
        }
    };

    tips:

    跟先序遍历类似:人工构建一个stack

    1. 每次栈顶元素出栈

    2. 判断tmp->right是否压入

    3. 如果tmp->left不为空:则把左节点保存下来;把tmp节点right left置为空(剪出来这个tmp点),入栈;左节点再入栈

        如果tmp->left为空:证明没有left了,直接将tmp->val加入到ret中

    ====================================

    上面的代码略微有些山寨,学习了一个比较consice的代码,自己写了一遍AC如下:

    代码:

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    public:
        vector<int> inorderTraversal(TreeNode* root) {
                vector<int> ret;
                stack<TreeNode *> sta;
                TreeNode *p = root;
                while ( !sta.empty() || p )
                {
                    if ( p )
                    {
                        sta.push(p);
                        p = p->left;
                    }
                    else
                    {
                        p = sta.top();
                        sta.pop();
                        ret.push_back(p->val);
                        p = p->right;
                    }
                }
                return ret;
        }
    };

    tips:

    维护一个指针p,指向当前要处理的TreeNode:

    1. 如果p不为空,则p入栈,p=p->left即p往左边走

    2. 如果p为空了,但是堆栈不为空,则证明继续往left方向走不通了,可以往右走了;从栈中弹出一个元素,将其值推入ret ,并继续右走(令p = p->right)

    =========================================

    第二次过这道题,感觉用递归的比较好写,不用递归的难度大一些,强迫不用递归。

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    public:
        vector<int> inorderTraversal(TreeNode* root) {
                vector<int> ret;
                stack<TreeNode*> sta;
                TreeNode* curr = root;
                while ( !sta.empty() || curr )
                {
                    if ( curr )
                    {
                        sta.push(curr);
                        curr = curr->left;
                    }
                    else
                    {
                        curr = sta.top();
                        sta.pop();
                        ret.push_back(curr->val);
                        curr = curr->right;
                    }
                }
                return ret;
        }
    };
  • 相关阅读:
    python基础练习题(题目 学习使用auto定义变量的用法)
    python基础练习题(题目 模仿静态变量的用法)
    roaring bitmap 与 bitmap 比较. 编译运行
    Linux 实现开关机测试,记录开机次数
    Linux 显示开机欢迎信息(/etc/issue 与 /etc/motd)
    Linux 修改文件权限概述
    把编译好的程序放在Linux系统里,实现不需要配置程序和动态库的环境变量,直接执行
    Linux 提示 is not a symbolic link 错误解决方法
    Ubuntu 自动更新详解【转】
    C#线程入门
  • 原文地址:https://www.cnblogs.com/xbf9xbf/p/4501655.html
Copyright © 2011-2022 走看看