二叉树各类遍历题
剑指 Offer 32 - I. 从上到下打印二叉树(层次遍历)
#deque队列
def levelOrder(self, root: TreeNode) -> List[int]:
res=[]
quene=deque([root])
while quene:
q=quene.popleft()
if q:
res.append(q.val)
quene.append(q.left)
quene.append(q.right)
return res
剑指 Offer 32 - II. 从上到下打印二叉树 II(层次遍历)
#deque队列
def levelOrder(self, root: TreeNode) -> List[List[int]]:
quene=deque([root])
res=[]
while quene:
n=len(quene)
temp=[]
for i in range(n):
q=quene.popleft()
if q:
temp.append(q.val)
quene.append(q.left)
quene.append(q.right)
if temp:
res.append(temp)
return res
剑指 Offer 32 - III. 从上到下打印二叉树 III
def levelOrder(self, root: TreeNode) -> List[List[int]]:
quene=deque([root])
res=[]
while quene:
n=len(quene)
temp=[]
for i in range(n):
q=quene.popleft()
if q:
temp.append(q.val)
quene.append(q.left)
quene.append(q.right)
if temp:
res.append(temp) if len(res)%2==0 else res.append(temp[::-1])
return res
剑指 Offer 54. 二叉搜索树的第k大节点(二叉搜索树的中序遍历为:递增序列)
给定一棵二叉搜索树,请找出其中第k大的节点。
#二叉搜索树本身就有规律(左子树比根节点小,右子树比根节点大)
#二叉搜索树的中序遍历为:递增序列
#中序遍历的倒序+判断
def kthLargest(self, root: TreeNode, k: int) -> int:
def helper(root):
if not root:
return
helper(root.right)#右
nonlocal n,res
n+=1
if n==k: #中+判断
res=root.val
return
helper(root.left)#左
n,res=0,0
helper(root)
return res
剑指 Offer 68 - I. 二叉搜索树的最近公共祖先(根据搜索树特点先序遍历进行判断)
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 4
输出: 2
#root值在p,q之间,p==root,q==root返回root
#否则继续遍历树
def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
def helper(root):
if not root or (root.val>p.val and root.val<q.val) or root.val==p.val or root.val==q.val:
return root
elif root.val>q.val and root.val>p.val:
res=helper(root.left)
elif root.val<q.val and root.val<p.val:
res=helper(root.right)
return res
if p.val>q.val:
p,q=q,p
return helper(root)
剑指 Offer 68 - II. 二叉树的最近公共祖先(先序遍历+判断)
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
输出: 3
输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
输出: 5
'''
根据先序遍历遍历整棵子树
若 root 是 p, q的最近公共祖先 ,则只可能为以下情况之一:
1、p和q 在 root的子树中,且分列 root的 异侧(即分别在左、右子树中);
2、p = root,且 q 在 root的左或右子树中;
3、q = root,且 p 在 root的左或右子树中;
'''
def lowestCommonAncestor(self, root: TreeNode, p: TreeNode, q: TreeNode) -> TreeNode:
if not root or root.val==p.val or root.val==q.val:
return root
l=self.lowestCommonAncestor(root.left,p,q)
r=self.lowestCommonAncestor(root.right,p,q)
if not r:return l
if not l:return r
return root
#l,r都有值,就是p,q在异侧
#只有一个有值就是在一侧