递归遍历
递归三要素
- 确定函数的参数和返回值
- 确定终止条件
- 确定单层递归的逻辑
以前序遍历为例
首先定义一个树
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
接下来:
函数的参数和返回值:
def preorderTraversal(self, root: TreeNode) -> List[int]
函数的终止条件:
if not root: return []
单层递归的逻辑:
取中节点的值,然后再次递归该节点的左节点和右节点
left = self.preorderTraversal(root.left)
right = self.preorderTraversal(root.right)
return [root.val] + left + right
整体代码:
递归遍历
如前文所写的先定义一个二叉树,在此基础上写一个从数组中构建完全二叉树的方法:insert
from typing import List
#python中二叉树的定义:
class TreeNode:
def __init__(self, val, left = None, right = None):
self.val = val
self.left = left
self.right = right
def insert(self, data):
# 将新值与父节点进行比较
if self.val: # 非空
if data < self.val: # 新值较小,放左边
if self.left is None: # 若空,则新建插入节点
self.left = TreeNode(data)
else: # 否则,递归往下查找
self.left.insert(data)
elif data > self.val: # 新值较大,放右边
if self.right is None: # 若空,则新建插入节点
self.right = TreeNode(data)
else: # 否则,递归往下查找
self.right.insert(data)
else:
self.val = data
定义三种深度优先遍历方式:代码随想录
class solution:
# 中左右
def preorderTravelsal(self, root:TreeNode)->List[int]: # 定义参数和返回值
if root is None:
return []
mid=root.val
left=self.preorderTravelsal(root.left)
right=self.preorderTravelsal(root.right)
return [mid]+left+right
def middleTravelsal(self, root: TreeNode) -> List[int]: # 定义参数和返回值
if root is None:
return []
left = self.middleTravelsal(root.left)
mid = root.val
right = self.middleTravelsal(root.right)
return left + [mid] + right
def backTravelsal(self, root: TreeNode) -> List[int]: # 定义参数和返回值
if root is None:
return []
left = self.backTravelsal(root.left)
right = self.backTravelsal(root.right)
mid = root.val
return left + right+ [mid]
if __name__ == "__main__":
data=[12,6,14,3]
root=TreeNode(data[0])
for i in range(1,len(data)):
root.insert(data[i])
s=solution()
print(s.preorderTravelsal(root))
print(s.middleTravelsal(root))
print(s.backTravelsal(root))