二叉树插入

373 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第20天,点击查看活动详情。 ​

介绍

给定二叉搜索树(BST)的根节点和要插入树中的值,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据保证,新值和原始二叉搜索树中的任意节点值都不同。注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。 你可以返回任意有效的结果。

思路

有多种有效的插入方式,还可以重构二叉搜索树,一下子吓退了不少人,其实可以不考虑改变树的结构的插入方式。如下演示视频中可以看出:只要按照二叉搜索树的规则去遍历,遇到空节点就插入节点就可以了。

image.png

方法

参数就是根节点指针,以及要插入元素,这里递归函数要不要有返回值呢?可以有,也可以没有,但递归函数如果没有返回值的话,实现是比较麻烦的,下面也会给出其具体实现代码。有返回值的话,可以利用返回值完成新加入的节点与其父节点的赋值操作终止条件就是找到遍历的节点为null的时候,就是要插入节点的位置了,并把插入的节点返回。搜索树是有方向了,可以根据插入元素的数值,决定递归方向。

通过递归函数返回值完成了新加入节点的父子关系赋值操作了,下一层将加入节点返回,本层用root->left或者root->right将其接住。刚刚说了递归函数不用返回值也可以,找到插入的节点位置,直接让其父节点指向插入节点,结束递归,也是可以的。

1. 如果当前节点为空,也就意味着val找到了合适的位置,此时创建节点直接返回。
2. 递归创建右子树
3. 递归创建左子树
    public TreeNode insertIntoBST(TreeNode root, int val) {
        if (root == null) 
            return new TreeNode(val);
        if (root.val < val){
            root.right = insertIntoBST(root.right, val); 
        }else if (root.val > val){
            root.left = insertIntoBST(root.left, val); 
        }
        return root;
    }