10.4二叉树 代码随想录day14打卡
普通递归方法
-
确定递归函数的参数和返回值:返回值一般是void,因为直接放在参数里了(在外部定义,并作为参数传入了)
-
确定终止条件
-
确定单层递归的逻辑: 确定每一层递归需要处理的信息。在这里也就会重复调用自己来实现递归的过程。
每一次的遍历,其实都落到了一个小子树里面
python 语法的查漏补缺:return后不带参数和写return None是一样的
普通遍历方法
1.前序遍历和后序遍历一致,后序可以由前序推出,也就是调整右左,并且将结果倒序输出。也就是:中左右-->中右左(调整控制语句输出)-->左右中(调整结果数列的输出)
2.中序遍历单列
造成普通遍历方法算法不一致的原因在于:
访问树的顺序和需要栈弹出的顺序不一致,也就是所谓的“访问”和“使用”不同。
python二叉树通用遍历方法
(仅以中序为例)拿245这个树来说,正常情况下,首先访问的是2这个节点,但是我们想要访问的顺序是524(也就是之后出栈的逆序)。 问题就变成了,当我们遇到2,也就是树的根节点的时候,我们如何将2不直接输出到结果中,而是暂时略过并且在栈中存入正确的次序524。同时,因为2为根节点的子树已经被我们放进栈中了,我们要对2进行标记,表示已经访问过该node了。
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
res=[]
st=[]#表示栈
if root:#当对树进行遍历的时候,先入栈
st.append(root)
while st:
node = st.pop()#这个根已经遍历过了,但是不是我们要的顺序,先把它弹出来
if node != None:#不是遍历过的中间节点
if node.right != None:#先放入右节点
st.append(node.right)
st.append(node)#放入中间节点
st.append(None) #为什么放入None 和前面的node!=None对应! 放入标记元素,这次是我们需要的顺序
if node.left !=None:#放入右节点
st.append(node.left)
else:
node = st.pop() #如果为None,证明要弹出新元素了
res.append(node.val)
return res