频率很高的手写代码面试题--二叉树类型(下)

这篇博客涵盖了常见的二叉树面试题,包括判断两棵树是否相同、验证二叉搜索树、对称二叉树的检查、计算左叶子之和、获取二叉树的右视图、序列化与反序列化二叉树、路径总和、根到叶子节点数字之和以及构建最小高度树。通过深入解析解题思路和示例,帮助读者掌握这些经典问题。
摘要由CSDN通过智能技术生成

1、相同的树

给定两个二叉树,编写一个函数来检验它们是否相同

如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

思路:
(1)如果两个节点都为空,则返回True

(2)如果都不为空且相等,则要进行递归往左和往右遍历

(3)如果上述条件都不满足,假如:一个为空、一个不为空、或者节点值不相等,这些情况直接返回False

    def isSameTree(self, p: TreeNode, q: TreeNode) -> bool:
        if p==None and q==None:
            return True
        
        if p!=None and q!=None and p.val ==q.val:
            return self.isSameTree(p.left,q.left) and self.isSameTree(p.right,q.right)
        else:
            return False

方法二:

    def isSameTree(self, p: TreeNode, q: TreeNode) -> bool:
        if q and p:
            return p.val==q.val and self.isSameTree(p.left,q.left) and self.isSameTree(p.right,q.right)
        # 如果他们都为空则返回True,否则返回False
        return q is p
        # return q == p   

2、验证二叉搜索树

给定一个二叉树,判断其是否是一个有效的二叉搜索树。

假设一个二叉搜索树具有如下特征:

节点的左子树只包含小于当前节点的数。
节点的右子树只包含大于当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。

示例
输入:

  2
 / \
1   3
输出: true
示例

输入:

  5
 / \
1   4
   / \
  3   6
  
输出: false
解释: 输入为: [5,1,4,null,null,3,6]
根节点的值为 5 ,但是其右子节点值为 4 

验证二叉树其实最简单的思想就是进行中序遍历的判断,因为二叉树中序的序列式递增的序列。

但是我们在比较的时候,不能用根节点和左右子树去比较,这其实是一个误区 !

比如下面案例:

  5
 / \
1   7
   / \ 
  6   8

思路:递归思想。首先看的根节点,根节点的值不能和1,7比较,7应该介于int 和 -int 之间

然后如果满足,则往左递归,这时候和1节点比较的是 -int 和 5,再往左递归发现是none,则返回,然后往右递归也是空,返回。

接着,还是往右递归,这时候root 节点值为7,节点7不能和6,8比较,应该和 5,int 比较,如果满足则往左递归,root的值是6,这时候6比较的是5,7它应该介于5,7之间…

# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def isValidBST(self, root: TreeNode) -> bool:
        def juedge(left,root,right):
            if not root:
                return True
            if left<root.val<right:
                return juedge(left,root.left,root.val) and juedge(root.val,root.right,right)
            else:
                return False
        return juedge(-float('INF'),root,float('INF'))
        # inf 代表正无穷,-inf 代表负无穷

3、对称二叉树

给定一个二叉树,检查它是否是镜像对称的。

例如,二叉树 [1,2,2,3,4,4,3] 是对称的。

    1
   / \
  2   2
 / \ / \
3  4 4  3

但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:

    1
   / \
  2   2
   \   \
   3    3

思路:
(1)如果左子树或右子树有一个为空,则判断两个是否都为空,如果都为空则返回 True,否则返回 False

(2)如果两个节点值不相等返回 False,否则进行递归判断

class Solution:
    def isSymmetric(self, root: TreeNode) -> bool:
        if not root:
            return True
        def judeg(lroot,rroot):
            if not lroot or rroot:
                return lroot is rroot
            if lroot.val != rroot.val:
                return False
            return judeg(lroot.left,rroot.right) and judeg(lroot.right,rroot.left)
        return judeg
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿的温柔香

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值