秒懂【二叉树中序遍历】!递归一步步拆解。

1.思路

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

alt

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

alt

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

alt

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

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

alt

如果文字描述的不太清楚,你可以参考视频的详细讲解B站@好易学数据结构

2.代码

2.1 Python代码

# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param root TreeNode类 
# @return int整型一维数组
#
class Solution:
    def inorderTraversal(self , root: TreeNode) -> List[int]:
        # write code here
        res = []
        self.midOrder(res, root)
        return res

    def midOrder(self, res, root):
        # 2. 递归终止条件:遇到空节点则返回
        if root is None:
            return

        # 1.问题分解(递推公式)
        # 1.1 先左子树
        self.midOrder(res, root.left)
        # 1.2 再访问根节点
        res.append(root.val)
        # 1.3 最后去右子树
        self.midOrder(res, root.right)

2.2 Java代码

import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 *   public TreeNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param root TreeNode类
     * @return int整型一维数组
     */
    public int[] inorderTraversal (TreeNode root) {
        // write code here
        List<Integer> list = new ArrayList<>();
        inOrder(list, root);
        int[] res = new int[list.size()];
        for (int i = 0; i < list.size(); i++) {
            res[i] = list.get(i);
        }
        return res;
    }

    private void inOrder(List<Integer> list, TreeNode root) {
        // 2. 递归终止条件:遇到空节点则返回
        if (root == null) {
            return;
        }

        // 1. 问题分解(递推公式)
        // 1.1 先左子树
        inOrder(list, root.left);
        // 1.2 再访问根节点
        list.add(root.val);
        // 1.3 最后去右子树
        inOrder(list, root.right);
    }
}

2.3 Go代码

package main

import . "nc_tools"

/*
 * type TreeNode struct {
 *   Val int
 *   Left *TreeNode
 *   Right *TreeNode
 * }
 */

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 *
 * @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)
}

如果上面的代码理解的不是很清楚,你可以参考视频的详细讲解B站@好易学数据结构