💯
1. 题目描述和解答
leetcode144:给你二叉树的根节点 root ,返回它节点值的前序遍历。
这道题虽然是前序遍历,但是可以衍生到后序和中序遍历中去,下面给出递归的写法
- 前序遍历:
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 #返回最后结果
结果如下:
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.结束语
虽然题目较为简单,但是贵在坚持✊!