代码随想录算法训练营第十七天 | 二叉树part05
654 最大二叉树
这题我甚至没看懂题目,但我会一点递归了。按照给的解释就可以很轻松的把代码写出来。
if not nums:
return
root_val = max(nums)
root = TreeNode(root_val)
seperator_idx = nums.index(root_val)
nums_left = nums[ : seperator_idx]
nums_right = nums[seperator_idx + 1 :]
root.left = self.constructMaximumBinaryTree(nums_left)
root.right = self.constructMaximumBinaryTree(nums_right)
return root
617 合并二叉树
思路:同样使用递归,看代码一目了然,就是单纯的看节点有无左右孩子,然后分开递归。
if not root1 and not root2:
return
if not root1 and root2:
root_val = root2.val
root = TreeNode(root_val)
root.left = self.mergeTrees(None,root2.left)
root.right = self.mergeTrees(None,root2.right)
if root1 and not root2:
root_val = root1.val
root = TreeNode(root_val)
root.left = self.mergeTrees(root1.left,None)
root.right = self.mergeTrees(root1.right,None)
if root1 and root2 :
root_val = root1.val + root2.val
root = TreeNode(root_val)
root.left = self.mergeTrees(root1.left,root2.left)
root.right = self.mergeTrees(root1.right,root2.right)
return root
700 二叉搜索树中的搜索
二叉搜索树是一个有序树:
- 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
- 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
- 它的左、右子树也分别为二叉搜索树
迭代法
while root:
if root.val < val:
root = root.right
elif root.val > val :
root = root.left
else:
return root
return
递归法
如果没有使用 return,找到的节点就不会被传回给原始的函数调用,而是会在中间某处丢失,最终返回 None。
使用 return 确保了:
- 如果在子树中找到了目标值,这个结果会一路传回到最初的函数调用。
- 如果没有找到目标值(搜索到叶子节点还没找到),
None会被正确地返回。
每一层的 return 就像是一个传递接力棒的过程,确保最终的结果能够回到起点。
while root:
if root.val == val :
return root
elif root.val < val:
return self.searchBST(root.right,val)
elif root.val > val:
return self.searchBST(root.left,val)
98 验证二叉搜索树
思路:二叉搜索树如果按照中序遍历,那么肯定就是一个有序的排列,我们可以进行中序遍历,将结果存储到一个列表中,然后再存储到一个字典当中,如果字典中的有序对的数量和列表的长度一样,那么就return True。如果列表和自己的升序排列一样的话,那么就return True。
result = []
def dfs(node):
if node is None:
return
dfs(node.left)
result.append(node.val)
dfs(node.right)
dfs(root)
dict1 = {}
for i in result:
dict1[i] = dict1.get(i,0) + 1
if len(dict1) != len(result):
return False
if result == sorted(result):
return True
else:
return False