leetcode 701. insert-into-a-binary-search-tree 二叉搜索树中的插入操作 python3

时间:2020-9-22

题目地址:https://leetcode-cn.com/problems/insert-into-a-binary-search-tree/

题目难度:Medium

题目描述:

给定二叉搜索树(BST)的根节点和要插入树中的值,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 保证原始二叉搜索树中不存在新值。

注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。 你可以返回任意有效的结果。

例如, 

给定二叉搜索树:

        4
       / \
      2   7
     / \
    1   3

和 插入的值: 5
你可以返回这个二叉搜索树:

         4
       /   \
      2     7
     / \   /
    1   3 5
或者这个树也是有效的:

         5
       /   \
      2     7
     / \   
    1   3
         \
          4


思路1:迭代

  1. 根据节点值与目标节点值的关系,搜索左子树或右子树;
  2. 重复步骤 1 直到到达外部节点;
  3. 根据节点的值与目标节点的值的关系,将新节点添加为其左侧或右侧的子节点。

代码段1:通过

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def insertIntoBST(self, root: TreeNode, val: int) -> TreeNode:
        if not root :
            return TreeNode(val)
        res = root
        while root:
            if root.val > val:
                if root.left == None:
                    root.left = TreeNode(val)
                    break
                else:
                    root = root.left
            if root.val < val:
                if root.right == None:
                    root.right = TreeNode(val)
                    break
                else:
                    root = root.right
        return res


#这是大佬写的 可以看到他的会更优雅一下
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def insertIntoBST(self, root: TreeNode, val: int) -> TreeNode:
        if not root: return TreeNode(val)
        p = root
        while True:
            if p.val > val:
                if p.left is None:
                    p.left = TreeNode(val)
                    break
                else:
                    p = p.left
            if p.val < val:
                if p.right is None:
                    p.right = TreeNode(val)
                    break
                else:
                    p = p.right
        return root

总结:

  1. 这道题很快写完了,写算法真的需要一个很好的状态


思路2:递归

代码段2:通过

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def insertIntoBST(self, root: TreeNode, val: int) -> TreeNode:
        if not root: return TreeNode(val)
        if root.val < val:
            root.right = self.insertIntoBST(root.right, val)
        else:
            root.left = self.insertIntoBST(root.left, val)
        return root

总结:

  1. 递归是永远的痛,整了一个7天的课,努力努力

2021-02-01

总结:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def insertIntoBST(self, root: TreeNode, val: int) -> TreeNode:
        def traverse(root, val):
            if root == None:
                root = TreeNode(val)
                return root # Q1:为什么要返回增加的那个结点?
            if root.val < val:
                root.right = traverse(root.right, val) # Q2:为什么需要等号左边的部分? A:需要把增加的结点和之前的树连接起来
            if root.val > val:
                root.left = traverse(root.left, val)
            return root           
        return traverse(root, val)
  1. 这次还是没有写出来,不过想了一下想明白了,还是得明白每个结点要干什么,所以这里需要很多赋值和返回

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值