codetop打卡第一天

319 阅读2分钟

🐬开了一天的会议,接着来打卡codetop的第一天,今天带来的题目是树的前、中、后序遍历,🐬\color{#4285f4}{开了一天的会议,接着来打卡codetop的第一天,今天带来的题目是树的前、中、后序遍历,}

💯废话不多说,开始今天的学习。\color{#fbbc05}{废话不多说,开始今天的学习。}

1. 题目描述和解答

leetcode144:给你二叉树的根节点 root ,返回它节点值的前序遍历。

image.png

这道题虽然是前序遍历,但是可以衍生到后序和中序遍历中去,下面给出递归的写法

  • 前序遍历:
def pre_order(root):
    res=[] #存储遍历的结果
    if not root:# 递归终止的条件
        return res
    res.append(root.val) #前序遍历先加入根节点
    res.extend(pre_order(root.left)) #递归,前序遍历左子树,进行拼接
    res.extend(pre_order(root.right)) #递归,前序遍历右边子树,进行拼接
    return res #返回最后结果

结果如下:

image.png

2. 题目拓展

既然前序遍历会写了,那么这里将中序和后序也写出来:

  • 中序遍历:修改根节点的位置到中间(中序遍历出现频率较高,这里介绍两种写法)
#1. 中序遍历
def mid_order(root):
    res=[] #存储遍历的结果
    if not root:# 递归终止的条件
        return res
    res.extend(mid_order(root.left)) #递归,中序遍历左子树,进行拼接
    res.append(root.val) #前序遍历先加入根节点
    res.extend(mid_order(root.right)) #递归,中序遍历右边子树,进行拼接
    return res #返回最后结果
    
    
#2. 栈实现中序,非递归
def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
            stack=[]
            res=[]
            #当栈内有节点或根节点不为空,则继续循环。
            while stack or root:
            #节点不为空时一直找左子树最左边的元素。
                while root:
                    stack.append(root)
                    root=root.left
                #找到后出栈加入数组作为第一个元素
                root=stack.pop()
                res.append(root.val)
                #然后看该节点是否有右支。
                root=root.right
            return res

  • 后序遍历:修改根节点的位置到后面
# 后序遍历
def end_order(root):
    res=[] #存储遍历的结果
    if not root:# 递归终止的条件
        return res
    res.extend(end_order(root.left)) #递归,后序遍历左子树,进行拼接
    res.extend(end_order(root.right)) #递归,后序遍历右边子树,进行拼接
    res.append(root.val) #后序遍历先加入根节点
    return res #返回最后结果

3.结束语

虽然题目较为简单,但是贵在坚持✊!