python实现二叉树的中序遍历

python实现二叉树的中序遍历

思路

中序遍历:左 --> 根 --> 右

考虑问题

1. 对于一颗二叉树,我们怎么中序遍历?

宏观来看:
首先遍历左子树并访问(左),访问根结点(根),遍历右子树(右)

2. 那么,左子树怎么遍历呢?

2.1 把左子树看做一颗新的树,首先遍历左子树,访问根节点,遍历右子树。(左根右)
总结
访问左子树是一个递归操作,访问右子树是一个递归操作。因为每棵树都可以有左子树和右子树,而每个左子树和右子树都可以有它们的左子树和右子树。

3. 递归的终止条件是什么?

3.1 这个问题其实就是问,每一颗树的第一个被访问结点是什么?
假设我们一直往左走,走到左结点为空的时候,是不是就是访问的第一个结点
3.1.1 一直往左走:代表左结点不空,即进入递归。
3.1.2 左结点为空:代表找到下一个要访问的结点。

4. 左子树全部访问完之后,怎么办?

4.1 左子树已经全部访问完了,此时退出递归,root指向还未被访问的根节点,因此,我们需要访问当前的根节点。
4.2 最后,我们需要访问右子树,即进入新的递归,此时右子树的根节点是root.right。
4.2.1 如果root.right是空的时候,没有右子树,那么二叉树已经全部完毕;
4.2.2 不空的时候,以中序遍历的方式访问右子树(依旧是3中的思路)。

5. 为什么考虑到使用递归?

5.1 我们需要找到最左面的结点,但同时又需要存储前一个访问的结点(根节点),这样才可以找到右面的结点。退出一层递归时,当前变量中的值正好是上一次的值。
5.2 对于每一棵树(一个或多个结点组成)的遍历,我们都有相同的访问顺序(左根右)和相同的终止条件

代码实现

class Solution:
    def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        if root == None:
            return [] # 空树,直接返回
        else:
            queue = [] # 输出是一个列表,先初始化一个空列表
            queue = self.inorder(root, queue) # 返回中序访问的结点值
            return queue
    def inorder(self, root, queue):
        if root.left == None:
            queue.append(root.val) # 一直往左走,走不动了,访问
        else:
            self.inorder(root.left, queue) # 遍历左边这棵树
            queue.append(root.val) # 访问这棵树的根节点
        if root.right != None:
            self.inorder(root.right, queue) # 遍历右边这棵树
        return queue

注意

  1. 最后返回是一个int元素组成的列表,因此,我们需要初始化一个空列表。
  2. 左子树访问完之后,根节点并没有被访问,需要单独访问。(加入列表–代码第14行)
  3. 右结点(右子树)为空时,不需要任何操作,退回到上一次进递归的位置即可。(访问根节点,或者根节点的右结点)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值