学习资料:代码随想录 (programmercarl.com)
701. 二叉搜索树中的插入操作
题目链接: 701. 二叉搜索树中的插入操作 - 力扣(LeetCode)
思路:从二叉搜索树的叶子节点找到要插入节点的位置,加到此叶子节点的下面。此法非常高效,在遍历时,只需根据当前节点和插入值的大小比较,决定向左还是向右走,等到达最底部,就建一个节点,直接插入便可。
class Solution(object):
def insertIntoBST(self, root, val):
if root == None:
node = TreeNode(val)
return node
# 上面代表找到要插入的叶子节点的位置,就新建一个node,把这个值返回回来,返回到上一层的
# 左节点或者右节点,取决于下面的判断标准:
if val < root.val:
root.left = self.insertIntoBST(root.left, val)
# 左边的root.left代表我们想把新的值赋给当前节点的左子树,右边
# 的root.left意味着要继续从当前节点的右节点向下追踪
if val > root.val:
root.right = self.insertIntoBST(root.right, val)
return root
在判断终止条件上,我最开始想的是当当前节点无子嗣时,就根据当前值和节点值的大小给当前值赋予一个新的左节点或者右节点,但这当中包含了下面递归的逻辑了,一切变得混乱了......其实,当到达原本二叉搜索树的叶子节点时,下面这个代码
root.left = self.insertIntoBST(root.left, val)
已经带我们来到了原来叶子节点的子嗣,是空的,那么就直接建立一个新node,return出来就好。
此题突然让我进一步领悟递归。递归的上半段是终止条件——”我们找到想要的节点/位置了,那么要干些什么(把值返回去,还是新建个node返回去?...)?“, 下半段则是确定我们寻找的线路/方向在哪里,等终止后,就再把值一步步地返回上去。