algorithms/src/main/java/com/wld/java/leetcode/leetCode0701.md at master · sdwwld/algorithms

701. 二叉搜索树中的插入操作(中等)

给定二叉搜索树(BST)的根节点和要插入树中的值,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 ,新值和原始二叉搜索树中的任意节点值都不同。

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

示例 1:

img

输入:root = [4,2,7,1,3], val = 5
输出:[4,2,7,1,3,5]
解释:另一个满足题目要求可以通过的树是:

img

示例 2:

输入:root = [40,20,60,10,30,50,70], val = 25
输出:[40,20,60,10,30,50,70,null,null,25]

示例 3:

输入:root = [4,2,7,1,3,null,null,null,null,null,null], val = 5
输出:[4,2,7,1,3,5]

提示:

  • 给定的树上的节点数介于 0 和 10^4 之间
  • 每个节点都有一个唯一整数值,取值范围从 0 到 10^8
  • -10^8 <= val <= 10^8
  • 新值和原始二叉搜索树中的任意节点值都不同

答案:

1,非递归方式解决

这题说的是让在二叉搜索树中插入一个节点,最简单的一种方式就是插入到叶子节点。二叉搜索树的特点是左子树的值都小于当前节点,右子树的值都大于当前节点,并且左右子树都具有这个特性。所以我们需要用插入的值val和根节点比较,

  • 如果val大于根节点,说明值为val的节点应该插入到root节点的右子树上
  • 如果val小于根节点,说明值为val的节点应该插入到root节点的左子树上

然后再继续执行上面的操作,直到找到叶子节点为止,然后再把它插进去,就以题中示例为例画个图来看一下

代码如下

public TreeNode insertIntoBST(TreeNode root, int val) {
    //边界条件判断
    if (root == null)
        return new TreeNode(val);
    TreeNode cur = root;
    while (true) {
        //如果当前节点cur的值大于val,说明val值应该插入到
        //当前节点cur的左子树,否则就插入到当前节点cur的右子树
        if (cur.val > val) {
            //如果左子节点不为空,就继续往下找
            if (cur.left != null) {
                cur = cur.left;
            } else {//如果左子节点为空,就直接插入去,然后再返回root节点
                cur.left = new TreeNode(val);
                return root;
            }
        } else {//同上
            if (cur.right != null) {
                cur = cur.right;
            } else {
                cur.right = new TreeNode(val);
                return root;
            }
        }
    }
}

2,递归方式解决

递归的方式原理还和上面一样,一直往下找,直到找到叶子节点为止,代码如下

public TreeNode insertIntoBST(TreeNode root, int val) {
    //如果root为空,就直接创建一个新的节点
    if (root == null)
        return new TreeNode(val);
    //如果root节点的值大于val,说明值为val的节点应该在root
    //节点的左子树上
    if (root.val > val)
        root.left = insertIntoBST(root.left, val);
    else
        root.right = insertIntoBST(root.right, val);
    return root;
}

3,总结

做这题之前首先要弄懂什么是二叉搜索树,然后才能进行后面的操作,最简单的方式就是把值插入到二叉搜索树的叶子节点。