zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    欧拉函数线性筛法
    欧拉筛素数
    05:登月计划
    09:LGTB 学分块
    2017.7.15清北夏令营精英班Day1解题报告
    T7316 yyy的最大公约数(者)
    T7314 yyy的巧克力(钟)
    T7315 yyy矩阵折叠(长)
    DataReader,DataTable利用泛型填充实体类
    数据库入库的方式实现
  • 原文地址:https://www.cnblogs.com/shan333/p/15709286.html
Copyright © 2011-2022 走看看