617 合并二叉树
题目链接:617. 合并二叉树 - 力扣(LeetCode)
思路:如果一棵树对应的位置是None, 那就返回另一课树,如果不是,则把两棵树的值相加。左子树和右子树分别进行递归。
class Solution(object):
def mergeTrees(self, root1, root2):
if root1 == None:
return root2
if root2 == None:
return root1
root = TreeNode(root1.val + root2.val)
root.left = self.mergeTrees(root1.left, root2.left)
root.right = self.mergeTrees(root1.right, root2.right)
return root
二叉搜索树的节点搜索与验证
回顾一下二叉搜索树的定义:根节点的值要比左子树中所有节点的值要大,比右子树中所有节点的值要小。同时左子树和右子树都符合这一规定。
700. 二叉搜索树中的搜索
题目链接: 700. 二叉搜索树中的搜索 - 力扣(LeetCode)
有了这个定义,很快便能写出代码:如果节点值比当前root小,就在root的左子树里面继续找,如果比当前root大,就在root的右子树里面找,如果和root值相等,或者root为空,直接返回root.
class Solution(object):
def searchBST(self, root, val):
if root == None or val == root.val:
return root
if val < root.val:
return self.searchBST(root.left, val)
if val > root.val:
return self.searchBST(root.right, val)
不用递归,也可以直接用迭代法:
class Solution(object):
def searchBST(self, root, val):
while root:
if val > root.val:
root = root.right
elif val < root.val:
root = root.left
else:
return root
return None
98. 验证二叉搜索树
这道题不能像之前那样设定好单独的条件(根节点大于左节点,小于右节点)后,将左子树和右子树部分分别放入递归,因为我们要考虑的是左子树和右子树的所有节点和根节点的数值比较,不能单独考虑每个小二叉树。比如:
根节点5的右子树符合判断情况,但节点3小于5,整体不符合。
二叉搜索树巧妙的一点是它们的中序数组是有序的!因此,我们只需用递归得到它的中序遍历得到的数组是不是单调递增的就可。
class Solution(object):
def __init__(self):
self.list = []
def traversal(self, root):
if not root:
return None
self.traversal(root.left)
self.list.append(root.val)
self.traversal(root.right)
def isValidBST(self, root):
self.list = []
self.traversal(root)
for i in range(len(self.list) - 1):
if self.list[i] >= self.list[i + 1]:
return False
return True