LeetCode 94 二叉树的中序遍历

题目

给定一个二叉树的根节点 r o o t root root ,返回 它的 中序 遍历 。

示例 1 1 1
输入: r o o t = [ 1 , n u l l , 2 , 3 ] root = [1,null,2,3] root=[1,null,2,3] 输出: [ 1 , 3 , 2 ] [1,3,2] [1,3,2]
示例 2 2 2
输入: r o o t = [ ] root = [] root=[] 输出: [ ] [] []
示例 3 3 3
输入: r o o t = [ 1 ] root = [1] root=[1]输出: [ 1 ] [1] [1]

提示:

  • 树中节点数目在范围 [ 0 , 100 ] [0, 100] [0,100]
  • − 100 < = N o d e . v a l < = 100 -100 <= Node.val <= 100 100<=Node.val<=100

思路

  1. 思路一:使用递归遍历

该方法在此不作阐述,参考力扣第 144 144 144题的前序遍历思路即可。
代码:

class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
        vector<int> vector;
        dfs(root,vector);
        return vector;
    }
    void dfs(TreeNode* cur,vector<int>& vector){
        if(cur == nullptr){
            return;
        }
        dfs(cur -> left,vector);
        vector.push_back(cur -> val);
        dfs(cur -> right,vector);
    }
};
  1. 思路二:使用迭代遍历

该方法与前面的前序遍历又有一些不同,不是简单改动一些顺序即可。
image.png
我们在前序遍历中对于节点的操作主要分为两种:

  • 访问:遍历到当前节点。
  • 操作:将当前节点放到数组中。

在之前的操作中我们都是遍历到那个节点就将该节点从栈中取出,因此我们对于每个节点的访问和操作是一致的。但是在这次的中序遍历中我们并非是访问到那个节点就对那个节点进行操作,而是先一直访问到最左侧的叶节点,然后对其进行操作。
例如在上图中的二叉树进行中序遍历时,我们最先放到数组中的节点是左下值为 1 1 1 的节点,但是我们首先访问到的节点确是根节点,因此我们需要一个指针指向我们当前访问的节点,并且使用判断是否到了最低端然后进行操作。
image.png
当指针指到底部时,我们其中的栈顶元素也就是当前节点的值放到数组中。
image.png
根据中序遍历的顺序,访问了左节点和根节点,接下来需要访问右节点,也就是使 c u r = c u r − > r i g h t cur = cur -> right cur=cur>right。但是由于该节点为空,因此我们退回访问上一级的根节点。
image.png
按照相同的规则,我们将当前节点的值放入数组中,接着将 c u r = c u r − > r i g h t cur = cur -> right cur=cur>right
image.png
最终得到这样的结果。
代码:

class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
        //初始化
        stack<TreeNode*> stack;
        vector<int> vector;
        TreeNode* cur = root;
        //loop
        while(stack.empty() == false || cur != nullptr){
            //首先来到最左侧节点
            if(cur != nullptr){
                stack.push(cur);
                cur = cur -> left;
            }else{
                cur = stack.top();
                stack.pop();
                vector.push_back(cur -> val);
                cur = cur -> right;
                
            }
        }
        return vector;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值