701_二叉搜索树中的插入操作

701_二叉搜索树中的插入操作

package 二叉树.二叉搜索树;
/**
 * https://leetcode-cn.com/problems/insert-into-a-binary-search-tree/
 * @author Huangyujun
 *
 */
public class _701_二叉搜索树中的插入操作 {
    //递归实现:
    //结果时空的???
    //修改后,返回结果也不对,看看大佬的代码(就是递归函数有返回,含义没搞清楚)
//    public TreeNode insertIntoBST(TreeNode root, int val) {
//        //使用递归
//        if(root == null)    return new TreeNode(val);
//        if(root.val == val) return root;
//        return (val > root.val) ? insertIntoBST(root.right, val) : insertIntoBST(root.left, val);
//    }
    //看到没:① root.left = insertIntoBST(root.left, val);
    //      ② root.right = insertIntoBST(root.right, val);
    //题目接口含义:向一棵树插入一个结点,并返回树的根
    // insertIntoBST(root.left, val); 相应的:向左子树插入结点,返回的就是一颗左子树啦
    //启发:读懂 接口含义(使用递归时,要相应的套上含义)
    public TreeNode insertIntoBST(TreeNode root, int val) {
        if (root == null) {
            return new TreeNode(val);
        }
        if (val < root.val) {
            root.left = insertIntoBST(root.left, val);
        } else {
            root.right = insertIntoBST(root.right, val);
        }
        return root;
    }
    
    
    //迭代实现:①一开始:root == null; 创建一个结点(值即传入的val),然后返回给结点。
    //② 若值= 根值,重复了,直接return
    //③ 从根开始不断地遍历【需要记录一下父节点,以便跟插入结点构成联系】:(若值 > 父结点值【切换到右区域】),否者切换到左区域。直到找到一个 null的空地来建立结点:
    //④ 判断父结点:
    //● 没有左、右结点(判断一下父结点值和传入的值,从而得知插入是左还是右结点)
    //● 有左结点,直接插入在右结点位置
    //● 最后, 则插入在左结点位置
    public TreeNode insertIntoBST2(TreeNode root, int val) {
        
         if(root == null) {    //原来是一颗空树
            TreeNode newRoot = new TreeNode(val);
            return newRoot;
        }
        if(root.val == val)    return root;
        //遍历树,找找找,找到一个空的位置(newNode)
        TreeNode node = root;
        TreeNode parentNode = null;
        while(node != null) {
            parentNode = node;
            if(node.val > val) {    //当前值比较小了,往左区间
                node = node.left;
            }else if(node.val < val) {
                node = node.right;
            }else {
                return root;
            }
        }
        //这种情况是node 到达空啦
        TreeNode newNode = new TreeNode(val);
        //需要判断父结点是否有孩子
        if(parentNode.left == null && parentNode.right == null) {    //左右孩子都没有
            //判断当前值大小
            if(val > parentNode.val) {
                parentNode.right = newNode;
            }else {
                parentNode.left = newNode;
            }
        }else if(parentNode.left != null) {    //有左孩子
            parentNode.right = newNode;
        }else {
            parentNode.left = newNode;
        }
        return root;
    }
}

本文来自博客园,作者:一乐乐,转载请注明原文链接:https://www.cnblogs.com/shan333/p/15709286.html

原文地址:https://www.cnblogs.com/shan333/p/15709286.html