zoukankan      html  css  js  c++  java
  • Leetcode 94

    1 题目

    https://leetcode-cn.com/problems/binary-tree-inorder-traversal/

    2 题意

    给定一个二叉树,返回它的中序 遍历。

    示例:

    输入: [1,null,2,3]
       1
        
         2
        /
       3
    
    输出: [1,3,2]
    

    进阶: 递归算法很简单,你可以通过迭代算法完成吗?

    3 思路

    author's blog == http://www.cnblogs.com/toulanboy/

    3.1 中序遍历

    对于一颗树,先访问左子树,再访问根节点,最后访问右子树

    3.2 递归解法

    直接写一个函数,负责当前树的遍历。空树就是边界。

    3.3 非递归解法

    大体思路是使用栈模拟递归过程,实现中序遍历的次序要求。

    更具体描述为:

    (1)对于一颗树,依次把右子树、根、左子树进栈。这样出栈时便满足中序遍历。

    (2)从栈里面取出顶点,不停进行把右子树、根、左子树进栈的过程。

    (3)当栈为空,即说明所有节点遍历完毕。

    4 代码实现

    4.1 递归代码

    //author's blog == http://www.cnblogs.com/toulanboy/
    /**
     * 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> ans;
        void inorder(TreeNode* root){
            if(!root)
                return;
            inorder(root->left);//先遍历左子树
            ans.push_back(root->val);//再遍历根节点
            inorder(root->right);//最后遍历右子树
        }
        vector<int> inorderTraversal(TreeNode* root) {
            inorder(root);
            return ans;
        }
    };
    

    4.2 非递归代码

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    //author's blog == http://www.cnblogs.com/toulanboy/
    class Solution {
    public:
        
        vector<int> inorder(TreeNode* root){
            vector<int> ans;
            stack<TreeNode*> order;
            if(root == NULL)
                return ans;
    
            if(root->right) //先塞右子树
                order.push(root->right);
            order.push(new TreeNode(root->val));//再塞根
            if(root->left) //最后塞左子树
                order.push(root->left);
    
            TreeNode* temp;
            while(!order.empty()){
                temp = order.top();
                order.pop();
                //如果这个点是根或者是叶子,直接输出
                if(temp->left == NULL && temp->right == NULL){
                    ans.push_back(temp->val);
                }
                else{//否则说明这个树还有子树,还需要进行左右遍历
                    if(temp->right) //先塞右子树
                        order.push(temp->right);
                    order.push(new TreeNode(temp->val));//再塞根
                    if(temp->left) //最后塞左子树
                        order.push(temp->left);
                }
            }
            return ans;
        }
        vector<int> inorderTraversal(TreeNode* root) {
            return inorder(root);
        }
    };
    
  • 相关阅读:
    YourSQLDba遭遇.NET Framework Error 6522
    ORACLE NLS_DATE_FORMAT设置
    RHEL下SendMail修改发邮箱地址
    SQL Server如何定位自定义标量函数被那个SQL调用次数最多浅析
    ORACLE归档日志比联机重做日志小很多的情况总结
    ORACLE获取SQL绑定变量值的方法总结
    ORACLE SEQUENCE跳号总结
    ORACLE中seq$表更新频繁的分析
    批量修改所有服务器的dbmail配置
    MySQL 修改账号的IP限制条件
  • 原文地址:https://www.cnblogs.com/toulanboy/p/13669302.html
Copyright © 2011-2022 走看看