leetcode - 94. 二叉树的中序遍历

给定一个二叉树,返回它的中序遍历。中序遍历(LDR)是二叉树遍历的一种,也叫做中根遍历、中序周游。在二叉树中,中序遍历首先遍历左子树,然后访问根结点,最后遍历右子树。

示例:
在这里插入图片描述
进阶: 递归算法很简单,你可以通过迭代算法完成吗?

解法一:使用递归算法

class Solution {
public:
    void fun(TreeNode* root, vector<int>& men)  # 中序遍历递归函数
    {
        if(root->left==NULL && root->right==NULL)  # 如果该点的左右子节点都为空,那么直接存储该结点
            men.push_back(root->val);
        else if(root->left==NULL && root->right!=NULL)  # 如果该点的左子节点为空,右子节点不为空
        {
            men.push_back(root->val);  # 将该节点存储
            fun(root->right,men);  # 在对右子节点进行递归运算
        }
        else if(root->left!=NULL && root->right==NULL)  # 如果右子节点为空
        {
            fun(root->left,men);  # 先对左子节点进行递归运算
            men.push_back(root->val);  # 再存储该结点
        }
        else  # 如果左右子节点都不为空
        {
            fun(root->left,men);   # 先对左子节点进行递归运算
            men.push_back(root->val);  # 存储该结点值
            fun(root->right,men);  # 对右子节点进行递归运算
                
        }
    }
    vector<int> inorderTraversal(TreeNode* root) {
        if(root==NULL)  # 如果初始点值为空,直接返回空vector
            return {};
        vector<int> men;  # 建立一个容器用于存储二叉树的中序遍历值,初始为空
        fun(root,men);  # 递归函数
        return men;  # 返回存储的中序遍历值
    }
};

解法二:使用迭代算法

class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
        vector<int> vec;  # 用于存放二叉树进行中序遍历后的值
        stack<TreeNode*> stk;  # 用于存放结点
        if(root == NULL)  # 如果初始结点为空,直接返回空
            return {};
        TreeNode* r = root;  # 新建一个TreeNode*,存储root初始值
        while(!stk.empty()||r!=NULL)  # 如果堆栈不为空,同时当前结点不为NULL
        {
            while(r!=NULL)  # 如果当前结点不为NULL
            {
                stk.push(r);  # 将当前结点存进堆栈中
                r = r->left;  # 迭代至当前结点的左子树
            }
            r = stk.top();  # 当当前结点为NULL时,找到堆栈中top对应的结点值
            stk.pop();  # 弹出top的结点值,因为不需要了
            vec.push_back(r->val);  # 将结点结构中的val值存进vec中,迭代该节点的右子树
            r = r->right;
        }
        return vec;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值