代码随想录算法训练营第十七天 | 二叉树part05

50 阅读2分钟

代码随想录算法训练营第十七天 | 二叉树part05

654 最大二叉树

image.png

这题我甚至没看懂题目,但我会一点递归了。按照给的解释就可以很轻松的把代码写出来。

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 合并二叉树

image.png

思路:同样使用递归,看代码一目了然,就是单纯的看节点有无左右孩子,然后分开递归。

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 二叉搜索树中的搜索

image.png

二叉搜索树是一个有序树:

  • 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
  • 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
  • 它的左、右子树也分别为二叉搜索树

迭代法

while root:
    if root.val < val:
        root = root.right
    elif root.val > val :
        root = root.left
    else:
        return root
return 

递归法

如果没有使用 return,找到的节点就不会被传回给原始的函数调用,而是会在中间某处丢失,最终返回 None

使用 return 确保了:

  1. 如果在子树中找到了目标值,这个结果会一路传回到最初的函数调用。
  2. 如果没有找到目标值(搜索到叶子节点还没找到),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 验证二叉搜索树

image.png

思路:二叉搜索树如果按照中序遍历,那么肯定就是一个有序的排列,我们可以进行中序遍历,将结果存储到一个列表中,然后再存储到一个字典当中,如果字典中的有序对的数量和列表的长度一样,那么就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