力扣94二叉树的中序遍历

力扣94二叉树的中序遍历

题目描述

给定一个二叉树的根节点 root ,返回 它的 中序 遍历进阶: 递归算法很简单,你可以通过迭代算法完成吗?

输入输出详情

在这里插入图片描述

输入:root = [1,null,2,3]
输出:[1,3,2]
输入:root = []
输出:[]
输入:root = [1]
输出:[1]

算法1,使用递归完成中序,前序,后序遍历

//采用递归的思想,中序遍历
        vector<int>inorderTraversal(TreeNode*root)
        {
            if(root==nullptr)
            {
                return res;
            }
            inorderTraversal(root->left);
            res.push_back(root->val);
            inorderTraversal(root->right);
            return res;
        }
        //前序遍历,先将根结点存储再存储左节点,然后右节点
        vector<int>preOrderTraversal(TreeNode*root)
        {
            if(root==nullptr)
            {
                return res;
            }
            res.push_back(root->val);
            preOrderTraversal(root->left);
            preOrderTraversal(root->right);
            return res;
        }
        //后序遍历,先左再右最后再根
        vector<int>postOrderTraversal(TreeNode*root)
        {
            if(root==nullptr)
            {
                return res;
            }
            postOrderTraversal(root->left);
            postOrderTraversal(root->right);
            res.push_back(root->val);
            return res;
        }

算法2,使用栈进行迭代计算

//使用迭代和栈进行实现
        vector<int>inorderTraversal2(TreeNode*root)
        {
            vector<int>res;
            //建立堆栈保存当前的结点
            stack<TreeNode*>stk;
            //当结点存在的时候,并且堆栈不为空
            while(root!=nullptr||!stk.empty())
            {
                while(root!=nullptr)
                {
                    stk.push(root);
                    //当结点不为空的时候则结点向左结点移动
                    root=root->left;
                }
                //当root当前指的值为空的时候,那么就要将其向右移动,并将该值入队列
                root=stk.top();
                stk.pop();
                res.push_back(root->val);
                root=root->right;
            }
            return res;
        }

算法3,使用莫里斯中序遍历

 //使用莫里斯方法进行实现
     vector<int>inorderTraversal3(TreeNode*root)
     {
        vector<int>res;
        TreeNode*preDecessor=nullptr;

        while(root!=nullptr)
        {
            if(root->left!=nullptr)
            {
                //preDecessor结点就是当前root结点往左走一点,然后一直向右走直至无法走到为止
                preDecessor=root->left;
                //当preDecessor的右节点存在并且不等于根结点时候,preDecessor一直向右移动
                while (preDecessor->right!=nullptr&&preDecessor->right!=root)
                {
                    preDecessor=preDecessor->right;
                }
                //如果preDecessor的右指针,继续遍历左子树
                if(preDecessor->right==nullptr)
                {
                    preDecessor->right=root;
                    root=root->left;
                }

                //此时左子树已经访问完了,断开连接
                else{
                    res.push_back(root->val);
                    preDecessor->right=nullptr;
                    root=root->right;
                }
                
            }
            else{
                res.push_back(root->val);
                root=root->right;
            }
        }
        return res;
     }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值