【剑指offer】二叉树遍历

剑指 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(层次遍历)

Alt

#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
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210219195352782.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0NjIxODQ4,size_16,color_FFFFFF,t_70

'''
根据先序遍历遍历整棵子树
若 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在异侧
#只有一个有值就是在一侧
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值