时间: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 直到到达外部节点;
- 根据节点的值与目标节点的值的关系,将新节点添加为其左侧或右侧的子节点。
代码段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
总结:
-
这道题很快写完了,写算法真的需要一个很好的状态
思路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
总结:
-
递归是永远的痛,整了一个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)
-
这次还是没有写出来,不过想了一下想明白了,还是得明白每个结点要干什么,所以这里需要很多赋值和返回