浅谈个人对二叉树递归理解
三句话总结
分而治之
先递后归
归即是回溯
二叉树是一个大的树有左子树和右子树,我要对整个二叉树做后序遍历,宏观上看,就是把整个二叉树按照左右根的顺序遍历一遍,放进一个列表。但是二叉树有左有右,每个二叉树又看成是分裂成很多很多个小的二叉树,刚刚说了,宏观上,我是左右根的顺序遍历。好,现在来到左边,左边也是一个独立的二叉树,也是要左右根的顺序遍历的,好,那就从头到尾,尾巴就是叶子结点,终止条件就是root当前节点是空的说明没了就停了。好,现在左边二叉树开始遍历,左中根,这时候发现,左边的二叉树也是,可以看成,有一个中间的根,左边有个二叉树,右边有个二叉树,好,那现在就对左边的二叉树开始左右根遍历。。。一层一层和套娃一样,其实从宏观到微观,都是在执行一模一样的事情,都是左右根的遍历,只是它不断的分叉,所以,一直一直在往下面递,是的,在递,那啥时候归?就是碰到终止条件的时候。所以,递归函数一上来你就先确定一个终止条件,不然肯定栈溢出,因为他一直再往下递,你不给一个终止条件,她不知道深度的,就一直蒙着头往下递,你得让她归。回到二叉树这,实际上,就是大的分裂成小的,小的分裂成更小的但是!总体上的逻辑是一样的,左右根的遍历,并且放进去一个列表。那就写一个递归函数,不停的调用自身,在自己内部,往深处边递边把值添加进去列表。
说到返回值,需要注意,返回值的顺序是什么?注意我这里说的顺序不是前序后续中序遍历这种,而是,把值,归到结果列表里面的顺序。
一句话,最深的最先归!
意思是,返回值的时候,应该是最深处,就是碰到终止条件那个最深处的值先进到结果列表。就是往深处分叉的时候碰到终止条件了就往回归。
在递归的过程中,先处理最深层的节点,然后逐步向上返回。递归函数在遇到终止条件时返回,然后每层递归都会逐步向上返回结果。这个过程可以用“先递后归”来形容,即先递归到最底层,然后逐层返回。
代码实现
class TreeNode:
def __init__(self, value=0, left=None, right=None):
self.value = value
self.left = left
self.right = right
def postorder_traversal(root):
# 基本情况:如果当前节点为空,则返回一个空列表
if root is None:
return []
# 创建一个空列表用于存储结果
result = []
# 递归处理左子树
# 将左子树的后序遍历结果添加到 result 中
result.extend(postorder_traversal(root.left))
# 递归处理右子树
# 将右子树的后序遍历结果添加到 result 中
result.extend(postorder_traversal(root.right))
# 处理当前节点
# 将当前节点的值添加到 result 中
result.append(root.value)
return result