zoukankan      html  css  js  c++  java
  • 数据结构学习笔记4.2--插入节点

    插入一个节点,首先要找到插入的地方。需要从根节点开始,找到需要插入节点的父节点,

    如果插入节点比父节点小,则插入到左子节点处;如果插入节点比父节点大,则插入到右子节点处。

    图解:根据二叉树的节点的特点,找到插入节点的位置。

    image

    代码:

        /**
         * 插入节点,跟查找节点代码类似,只是在遇到null时,将节点插入,修改引用
         * @param id key值
         * @param dd value值
         */
        public void insert(int id, double dd)
        {
            // 插入的节点
            Node newNode = new Node();
            newNode.iData = id;
            newNode.dData = dd;
    
            // 如果根节点为空,则插入节点为根节点
            if (root == null)
            {
                root = newNode;
            }
            else
            {
                // 当前节点,引用会随在查找变化
                // 由于查找要插入的节点是从根基点开始,所以root引用赋值给current
                Node current = root;
    
                // 父节点
                // 有父节点的引用,才能够给子节点leftChild或者rightChild赋值
                Node parent;
                
                while (true)
                {
                    // 保存父节点的引用,因为后面在查找时,current的引用一定会为null,
                    // 此时说明已经找到插入节点的位置了
                    parent = current;
                    
                    // 插入节点在左子树
                    if (id < current.iData)
                    {
                        current = current.leftChild;
                        if (current == null)
                        {
                            parent.leftChild = newNode;
                            return;
                        }
                    }
                    // 插入节点在右子树
                    else
                    {
                        current = current.rightChild;
                        if (current == null)
                        {
                            parent.rightChild = newNode;
                            return;
                        }
                    }
                }
            }
        }

    插入节点与查找类似,区别:

    1.需要保存父节点,因为需要用父节点来连接字节点,建立插入节点在整棵树的位置。

    2.在判断插入节点在左子树,或者右子树时,current一定为null,此时需要把newNode的引用赋值上去。

    3.while循环以true为判断条件,这是很少用的。只要在确定一定都会有return时,才能够使用,不然会陷入死循环。由于二叉树的特点,肯定能找到插入节点的位置(除非内存溢出),

    因此,循环里面的return一定可以跳出。

  • 相关阅读:
    MYSQL 5.7修改密码,登录问题
    linux 系统 cp: omitting directory 问题解决
    闭包函数是什么
    ecshop 前台个人中心修改侧边栏 和 侧边栏显示不全 或 导航现实不全
    ecshop 前台分页
    php 5.3新增的闭包语法介绍function() use() {}
    剖析 Linux hypervisor
    长久的深情能否维系
    私有云的迁移:从VMware到OpenStack
    Openstack 架构简述
  • 原文地址:https://www.cnblogs.com/winlrou/p/3535277.html
Copyright © 2011-2022 走看看