Python剑指offer打卡-7

本文详细介绍了四种二叉树的算法问题:找到中序遍历下一个节点、判断对称二叉树、按之字形顺序打印以及层次打印。通过递归和迭代的方法,展示了如何高效地解决这些经典二叉树问题。同时,提供了Python代码实现和解题思路。
摘要由CSDN通过智能技术生成

Python剑指offer打卡-7

二叉树的下一个节点

  • 问题描述

    问题描述:
    给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
    
  • 代码(解题思路

    图解

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TDRc8K4V-1612663529671)(./imgs/中序遍历.png)]

  • class TreeLinkNode:
    
        def __init__(self, val):
            self.val = val
            self.left = None
            self.right = None
            self.next = None
    
    
    class Solution:
    
        def GetNext(self, pNode):
    
            if pNode.right:
                tmp_node = pNode.right
                while tmp_node.left:
                    tmp_node = tmp_node.left
                return tmp_node
            else:
                tmp_node = pNode
                while tmp_node.next:  
                    if tmp_node.next.left == tmp_node: # 当前节点为父节点的左节点
                        return tmp_node.next
                    tmp_node = tmp_node.next  # 寻找父结点, 当前结点为父节点的右节点
                return None
    

对称二叉树

  • 问题描述

    问题描述:
    请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的.
    示例:
        1
      2   2
    3  4 4  3
    
  • 代码(解题思路

    class Solution:
        
        def isSymmetric(self, root):
    
            def recur(L, R):
                if not L and not R: return True
                if not L or not R or L.val != R.val: return False
                return recur(L.left, R.right) and recur(L.right, R.left)
    
            return recur(root.left, root.right) if root else True
    

按之字形顺序打印二叉树

  • 问题描述

    请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,
    第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行
    以此类推。
    
    解题:
    构造奇偶条件,遍历不同顺序
    
  • 代码(解题思路

    # Definition for a binary tree node.
    import collections
    
    class TreeNode:
         def __init__(self, x):
             self.val = x
             self.left = None
             self.right = None
    
    class Solution:
        def levelOrder(self, root: TreeNode) -> List[List[int]]:
    
            if not root: return []
            res, deque = [], collections.deque([root])
    
            while deque:
                tmp = collections.deque()
                for _ in range(len(deque)):
                    node = deque.popleft() # 从左向右遍历
                    if len(res) % 2: tmp.appendleft(node.val) # 偶数层,队列首部,从右向左
                    else: tmp.append(node.val) # 奇数层,队列尾部
                    if node.left: deque.append(node.left)
                    if node.right: deque.append(node.right)
                
                res.append(list(tmp))
            return res
    

把二叉树打印成多行

  • 问题描述

    问题描述:
    从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
    
  • 代码(解题思路

    import collections
    
    class TreeNode:
         def __init__(self, x):
             self.val = x
             self.left = None
             self.right = None
    
    class Solution:
        def levelOrder(self, root: TreeNode) -> List[List[int]]:
    
            if not root: return []
            res, queue = [], collections.deque([root])
    
            while queue:
                tmp = []
                for _ in range(len(queue)):
                    node = queue.popleft()
                    tmp.append(node.val)
                    if node.left: queue.append(node.left)
                    if node.right: queue.append(node.right)
    
                res.append(tmp)
            return res
    

二叉搜索树的第k个节点

  • 问题描述

    问题描述:
    给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结
    点数值大小顺序第三小结点的值为4。
    
    解决方法:
    二叉搜索树的中序遍历为有序序列(递增序列),将其转换为逆序列,可以求得最大kth数值,并
    实现提前返回,减少时间复杂度。
    
  • 代码

    class Solution:
        def kthLargest(self, root: TreeNode, k: int) -> int:
            
            def dfs(root):
                if not root: return
                dfs(root.right)
                if self.k == 0: return  # 实现提前放回,节省内存消耗
                self.k -= 1
                if self.k == 0: self.res = root.val
                dfs(root.left)
    
            self.k = k
            dfs(root)
            return self.res
    

    参考

python collections 模块中的 deque

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值