当前位置: 首页 > news >正文

[javaSE] 数据结构(二叉查找树-插入节点)

二叉查找树(Binary Search Tree),又被称为二叉搜索树,它是特殊的二叉树,左子树的节点值小于右子树的节点值。

 

定义二叉查找树

定义二叉树BSTree,它保护了二叉树的根节点BSTNode类型的mRoot,定义内部类BSTNode

包含二叉树的几个基本信息:

key——关键字用来对二叉查找树的节点进行排序

left——指向当前节点的左孩子

right——指向当前节点的右孩子

parent——指向当前节点的父节点

 

定义插入节点方法insert(T key),参数:T key要插入的对象

创建节点对象,实例化BSTNode对象,构造参数:T对象

定义重载方法insert(BSTree bsTree,BSTNode bstNode)方法,参数:BSTree树对象,BSTNode节点对象

插入节点,分两步,

1.找到节点的父节点位置

2.插入节点到父节点的左位置或者右位置

public class BSTree<T extends Comparable<T>> {
    private BSTNode<T> mRoot;

    /**
     * 定义二叉树
     * 
     * @author taoshihan
     * @param <T>
     * 
     */
    public class BSTNode<T extends Comparable<T>> {
        public T key;
        public BSTNode parent, left, right;

        public BSTNode(T key, BSTNode parent, BSTNode left, BSTNode right) {
            this.key = key;
            this.parent = parent;
            this.left = left;
            this.right = right;
        }
    }

    public void insert(BSTree bsTree, BSTNode bstNode) {
        BSTNode parent = null;
        BSTNode x = bsTree.mRoot;
        // 查找bstNode的插入位置,x的指针指对
        while (x != null) {
            parent = x;// 把x的位置作为节点的父类
            int flag = bstNode.key.compareTo(x.key);
            if (flag < 0) {
                x = x.left;
            }else{
                x=x.right;
            }
        }
        // 插入
        bstNode.parent = parent;
        if(parent==null){
            bsTree.mRoot=bstNode;
        }else{
            int flag = bstNode.key.compareTo(parent.key);
            if (flag < 0) {
                parent.left = bstNode;
            } else {
                parent.right = bstNode;
            }        
        }

    }

    /**
     * 插入根节点
     * 
     * @param key
     */
    public void insert(T key) {
        BSTNode<T> z = new BSTNode<T>(key, null, null, null);
        // 如果新建结点失败,则返回。
        if (z != null)
            insert(this, z);
    }
    /*
     * 打印"二叉查找树"
     *
     * key        -- 节点的键值 
     * direction  --  0,表示该节点是根节点;
     *               -1,表示该节点是它的父结点的左孩子;
     *                1,表示该节点是它的父结点的右孩子。
     */
    private void print(BSTNode<T> tree, T key, int direction) {
        
        if(tree != null) {

            if(direction==0)    // tree是根节点
                System.out.printf("%2d is root\n", tree.key);
            else                // tree是分支节点
                System.out.printf("%2d is %2d's %6s child\n", tree.key, key, direction==1?"right" : "left");

            print(tree.left, tree.key, -1);
            print(tree.right,tree.key,  1);
        }
    }

    public void print(BSTree<T> tree) {
        if (tree.mRoot != null){
            print(tree.mRoot, tree.mRoot.key, 0);
        }
    }
    /**
     * @param args
     */
    public static void main(String[] args) {
        BSTree tree = new BSTree();
        tree.insert(3);
        tree.insert(1);
        tree.insert(2);
        tree.insert(5);
        tree.insert(4);
        tree.insert(6);
        tree.print(tree);
    }

}

 

输出:

3 is root
1 is 3's left child
2 is 1's right child
5 is 3's right child
4 is 5's left child
6 is 5's right child

 

相关文章:

  • JavaMelody监控
  • jquery option 动态 selected
  • 转载 Spring中应用反射机制浅析
  • MyCat_全局表及其死锁问题
  • TortoiseGit状态图标不能正常显示的解决办法
  • 怎么在Beyond Compare中同步压缩文件夹
  • iOS import framework头文件时报错could not build module xxx
  • java 多线程和线程池
  • jQuery Ajax无刷新操作
  • JavaScript里的数组转化新方法Array.From
  • 我的业余项目总结
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • 如何获取drawable目录下的图片绝对路径
  • iOS开发多线程篇 09 —NSOperation简单介绍
  • nb
  • (三)从jvm层面了解线程的启动和停止
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • 【译】理解JavaScript:new 关键字
  • Angular数据绑定机制
  • Apache Zeppelin在Apache Trafodion上的可视化
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • java第三方包学习之lombok
  • Java新版本的开发已正式进入轨道,版本号18.3
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • mac修复ab及siege安装
  • Nacos系列:Nacos的Java SDK使用
  • node入门
  • opencv python Meanshift 和 Camshift
  • python docx文档转html页面
  • springboot_database项目介绍
  • SpriteKit 技巧之添加背景图片
  • 和 || 运算
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 爬虫模拟登陆 SegmentFault
  • 前端相关框架总和
  • 使用 Docker 部署 Spring Boot项目
  • 微服务框架lagom
  • 我看到的前端
  • 一个JAVA程序员成长之路分享
  • 一个SAP顾问在美国的这些年
  • 1.Ext JS 建立web开发工程
  • 函数计算新功能-----支持C#函数
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • ​Python 3 新特性:类型注解
  • ​卜东波研究员:高观点下的少儿计算思维
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • (33)STM32——485实验笔记
  • (6)设计一个TimeMap
  • (八十八)VFL语言初步 - 实现布局
  • (二)fiber的基本认识
  • (四)JPA - JQPL 实现增删改查
  • (四)图像的%2线性拉伸
  • (淘宝无限适配)手机端rem布局详解(转载非原创)