代码随想录day14打卡 | 二叉树 10.4

79 阅读2分钟

10.4二叉树 代码随想录day14打卡

普通递归方法

  1. 确定递归函数的参数和返回值:返回值一般是void,因为直接放在参数里了(在外部定义,并作为参数传入了)

  2. 确定终止条件

  3. 确定单层递归的逻辑: 确定每一层递归需要处理的信息。在这里也就会重复调用自己来实现递归的过程。

每一次的遍历,其实都落到了一个小子树里面

 python 语法的查漏补缺:return后不带参数和写return None是一样的

普通遍历方法

1.前序遍历和后序遍历一致,后序可以由前序推出,也就是调整右左,并且将结果倒序输出。也就是:中左右-->中右左(调整控制语句输出)-->左右中(调整结果数列的输出)

2.中序遍历单列

造成普通遍历方法算法不一致的原因在于:

访问树的顺序和需要栈弹出的顺序不一致,也就是所谓的“访问”和“使用”不同。

python二叉树通用遍历方法

一个易懂的python题解

image.png

(仅以中序为例)拿245这个树来说,正常情况下,首先访问的是2这个节点,但是我们想要访问的顺序是524(也就是之后出栈的逆序)。 问题就变成了,当我们遇到2,也就是树的根节点的时候,我们如何将2不直接输出到结果中,而是暂时略过并且在栈中存入正确的次序524。同时,因为2为根节点的子树已经被我们放进栈中了,我们要对2进行标记,表示已经访问过该node了。

image.png

# 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