频率很高的面试题--二叉树类型
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