1. 题目

描述

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

数据范围:树上节点数满足 0≤n≤1000,树上每个节点的值满足 0 ≤val≤1000
进阶:空间复杂度 O(n),时间复杂度 O(n)

示例1

输入:

{1,2,#,#,3}

返回值:

[2,3,1]  

示例2

输入:

{}

返回值:

[]

示例3

输入:

{1,2}

返回值:

[2,1]

示例4

输入:

{1,#,2}

返回值:

[1,2]

2. 解题思路

需要先明确二叉树【中序】遍历的规则:

二叉树的遍历一般使用【递归】的方法。如果要采用递归方法需满足递归的2个条件:

可以看出,对于左子树、右子树的遍历操作与整个二叉树一样,只是数据规模不同。


对于整颗二叉树来说,叶子节点左右子树都是Null,满足递归的第二个条件:不能无限循环,有终止条件(节点为Null)。因此可以使用递归来完成二叉树的中序遍历。

这时,就可以依据前序遍历的规则写出递推公式与伪代码:

如果文字描述的不太清楚,你可以参考视频的详细讲解。

3. 编码实现

核心代码如下:

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 *
 * @param root TreeNode类
 * @return int整型一维数组
 */
func inorderTraversal(root *TreeNode) []int {
    // write code here
    list := make([]int, 0)
    midOrder(&list, root) //注意:传递的是切片对应的指针(切片的地址),否则会变成值传递,最后返回空切片
    return list
}

func midOrder(list *[]int, root *TreeNode) {
    // 2. 递归终止条件:遇到空节点则返回
    if root == nil {
        return

    }

    // 1. 问题分解(递推公式)
    // 1.1 先左子树
    midOrder(list, root.Left)
    // 1.2 再访问根节点
    *list = append(*list, root.Val)
    // 1.3 最后去右子树
    midOrder(list, root.Right)

}

具体完整代码你可以参考下面视频的详细讲解。

4.小结

中序遍历的规则是:先左子树 、再节点、最后右子树。

二叉树的中序遍历满足递归的两个条件,因此可以通过递归很快写出对应的递推公式:

f(node)= f(node.左子树) +output(node.val) +f (node.右子树) ,其中 f (空节点) = 空。

再根据递推公式就可以很快将其翻译成对应的代码。


《数据结构与算法》深度精讲课程正式上线啦!七大核心算法模块全解析:

✅ 链表 ✅ 二叉树 ✅二分查找、排序 ✅ 堆、栈、队列 ✅回溯算法 ✅ 哈希算法 ✅ 动态规划

无论你是备战笔试面试、提升代码效率,还是突破技术瓶颈,这套课程都将为你构建扎实的算法思维底座。🔥立即加入学习打卡,与千名开发者共同进阶!

对于二叉树的相关算法,我们总结了一套【可视化+图解】方法,依据此方法来解决相关问题,算法变得易于理解,写出来的代码可读性高也不容易出错。具体也可以参考视频详细讲解。

今日佳句:落霞与孤鹜齐飞,秋水共长天一色。


好易学数据结构
1 声望0 粉丝