Leetcode-二叉树

二叉树的一些思想

  • 前序遍历(preOrder) root->left->right
  • 中序遍历(inOrder) left-> root->right 二叉搜索树中,其遍历结果为有序数组
  • 后序遍历(postOrder) left->right->root
  • 广度优先搜索(BFS)
  • 深度优先搜索(DFS)
  • 递归(Recursion),根据要求选择使用前序,中序,后序的递归框架来解决问题

897. 递增顺序查找树

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 思路1: 中序遍历形成有序列表 + 重新生成树
# 思路2: 使用递归,改变树形状,不生成新的树
def increasingBST(self, root: TreeNode) -> TreeNode:
def dfs(root):
if not root: return
dfs(root.left)
### 对根节点的操作 ###
root.left = None
self.cur.right = root
self.cur = root
###################
dfs(root.right)
res = self.cur = TreeNode(None)
dfs(root)
return res.right

226. 翻转二叉树

1
2
3
4
5
6
7
8
9
10
def invertTree(self, root):
# 先序遍历 (后序遍历也可)
if not root: return None
### 对根节点的操作 ###
root.left,root.right = root.right,root.left
### 对根节点的操作 ###
root.left = self.invertTree(root.left)
root.right = self.invertTree(root.right)
# 函数返回时就表示当前这个节点,以及它的左右子树都已经交换完了
return root

617. 合并二叉树

1
2
3
4
5
6
7
8
9
10
def mergeTrees(self, t1: TreeNode, t2: TreeNode) -> TreeNode:
###### 对根节点的操作 #####
if not (t1 and t2): # 不能用 if not t1 and not t2
return t1 if t1 else t2
t1.val+=t2.val
#########################
t1.left = self.mergeTrees(t1.left,t2.left)
t1.right = self.mergeTrees(t1.right,t2.right)

return t1

938. 二叉搜索树的范围和

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def rangeSumBST(self, root: TreeNode, L: int, R: int) -> int:

self.res = 0 # 需要使用一个全局变量进行结果的保存

def dfs(root,L,R):
if not root: return
###### 对根节点的操作 #####
if L<= root.val <=R:
self.res+=root.val
#########################
dfs(root.left,L,R)
dfs(root.right,L,R)

dfs(root,L,R)
return self.res

104. 二叉树的最大深度

1
2
3
4
5
def maxDepth(self, root: TreeNode) -> int:
if not root:return 0
# 后序遍历
return max(self.maxDepth(root.left),self.maxDepth(root.right)) +1
# 也可以使用BFS得到高度

590. N叉树的后序遍历/前序遍历

1
2
3
4
5
6
7
8
9
10
11
def postorder(self, root: 'Node') -> List[int]:
self.res = []
def helper(root):
if not root:return
for child in root.children:
helper(child)
###### 对根节点的操作 #####
self.res.append(root.val)
###### 对根节点的操作 #####
helper(root)
return self.res

700. 二叉搜索树中的搜索

1
2
3
4
5
6
7
8
9
10
def searchBST(self, root: TreeNode, val: int) -> TreeNode:
if not root:return
###### 对根节点的操作 #####
if root.val == val:
return root
#########################
if root.val < val:
return self.searchBST(root.right,val) # 记住需要return
else:
return self.searchBST(root.left,val)

108. 将有序数组转换为二叉搜索树

1
2
3
4
5
6
7
8
9
10
def sortedArrayToBST(self, nums: List[int]) -> TreeNode:
###### 对根节点的操作 #####
if len(nums) == 0 : return
mid = len(nums)//2
root = TreeNode(nums[mid])
##########################
root.left = self.sortedArrayToBST(nums[:mid])
root.right = self.sortedArrayToBST(nums[mid+1:])

return root

897. 递增顺序查找树

1
2
3
4
5
6
7
8
9
10
11
12
13
def increasingBST(self, root: TreeNode) -> TreeNode:
def dfs(root):
if not root: return
dfs(root.left)
### 对根节点的操作 #####
root.left = None
self.cur.right = root
self.cur = root
#####################
dfs(root.right)
res = self.cur = TreeNode(None)
dfs(root)
return res.right

559. N叉树的最大深度

1
2
3
4
def maxDepth(self, root: 'Node') -> int:

if not root:return 0
return max([self.maxDepth(i) for i in root.children]+[0])+1 # 注意需要 +[0] => 没有0的话会报错: max() arg is an empty sequence

剑指 Offer 68 - II. 二叉树的最近公共祖先

1
2
3
4
5
6
7
8
9
10
11
12
def lowestCommonAncestor(self, root: TreeNode, p: TreeNode, q: TreeNode) -> TreeNode:

if not root or p == root or q == root: return root

left = self.lowestCommonAncestor(root.left,p,q)
right = self.lowestCommonAncestor(root.right,p,q)
### 对根节点的操作 #####
if not left and not right: return # 左右子树均为空
elif not left: return right # 右空,左不空
elif not right:return left # 左空,右不空
else: return root # 左右均不空
### 对根节点的操作 #####

637. 二叉树的层平均值


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!