二叉树递归反转中new_root.left的行为解析
二叉树反转递归代码疑问解答
首先明确:不会,new_root.left不会变成new_root.left.left,我们拆解这段代码的递归逻辑就能明白:
这段代码的核心是创建全新的二叉树节点来实现反转,而非修改原树的节点结构。每一次调用invertTree方法时,都会执行以下步骤:
- 如果传入的
root是空节点,直接返回None - 基于当前
root的值创建一个新节点new_root - 将
new_root.left赋值为「原root的右子树经过反转后的完整子树」——也就是调用self.invertTree(root.right)的返回结果 - 将
new_root.right赋值为「原root的左子树经过反转后的完整子树」——也就是调用self.invertTree(root.left)的返回结果 - 返回这个新创建的
new_root节点
举个简单的实例来理解:
假设原二叉树结构是:
1 / \ 2 3 / \ 4 5
- 第一次调用
invertTree(1):- 创建新节点
new_root(1) - 执行
new_root.left = invertTree(3):调用invertTree(3)时,3没有左右子树,所以返回一个值为3、左右子节点都是None的新节点,此时new_root.left就是这个新的3节点 - 执行
new_root.right = invertTree(2):调用invertTree(2)时,会创建新节点new_root(2),然后它的left是invertTree(5)的返回结果(新的5节点),right是invertTree(4)的返回结果(新的4节点),最终这个新的2节点会被赋值给上层的new_root.right
- 创建新节点
最终生成的反转树结构是:
1 / \ 3 2 / \ 5 4
你可以看到,每一层递归里的new_root都是独立的新节点,new_root.left是原节点右子树反转后的完整子树,而非自身左子树的左子树。递归的每一层只负责处理当前层级的节点,把原节点的左右子树反转后挂到新节点的对应位置,直到递归到叶子节点为止。
内容的提问来源于stack exchange,提问作者user21055738
相关产品推荐
相关产品推荐

