二叉树排序在Java代码的简单实现_代码写二叉树排序-程序员宅基地

二叉树排序在Java代码的简单实现

public class Main2Activity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        SortTree tree = new SortTree(10); // 初始化一个root并且给一个value
        tree.add(60);
        tree.add(15);
        tree.add(22);
        tree.add(17);
        tree.add(7);
        tree.add(8);
        tree.add(4);
        tree.add(13);

        tree.read();
        System.out.println("--root.value = " + tree.getRoot().getValue());
        tree.delete(12);
        System.out.println("---------after delete---------");
        tree.read();
        System.out.println("root.value = " + tree.getRoot().getValue());
    }


    class SortTree {
        private Node root;
        private int size;

        public SortTree(int v) {
            root = new Node(v);
            size = 1;
        }

        public Node getRoot() {
            return root;
        }

        public void setRoot(Node root) {
            this.root = root;
        }

        public int Size() {
            return size;
        }

        public void add(int value) {
            if (root == null)
                return;
            Node indexRoot = getRoot();
            Node parent = indexRoot;
            int indexValue = 0;
            while (indexRoot != null) {
                indexValue = indexRoot.getValue();
                parent = indexRoot;
                if (value < indexValue) {
                    indexRoot = indexRoot.getLeft();
                } else if (value > indexValue) {
                    indexRoot = indexRoot.getRight();
                } else {
                    return;
                }
            }
            Node newNode = new Node(value);
            if (value < indexValue) {
                parent.setLeft(newNode);
            } else if (value > indexValue) {
                parent.setRight(newNode);
            } else {
                return;
            }
            newNode.setParent(parent);
            size++;
        }

        public void read() { // 中序遍历
            read(root);
        }

        public void read(Node node) {
            if (node.getLeft() != null) {
                read(node.getLeft());
            }
            if (node != null) {
                System.out.println(node.getValue());
            }
            if (node.getRight() != null) {
                read(node.getRight());
            }
        }

        public void delete(int value) {
            if (root == null)
                return;
            Node indexRoot = getRoot();
            Node parent = indexRoot;
            int indexValue = indexRoot.getValue();
            while (indexValue != value && indexRoot != null) {
                parent = indexRoot;
                if (value < indexValue) {
                    indexRoot = indexRoot.getLeft();
                } else if (value > indexValue) {
                    indexRoot = indexRoot.getRight();
                }
                if (indexRoot != null) {
                    indexValue = indexRoot.getValue();
                }
            }

            if (indexRoot == null) {
                return;
            }

            // no any nodes
            if (indexRoot.getLeft() == null && indexRoot.getRight() == null) {
                if (parent.getLeft() == indexRoot) { // if is leftNode
                    parent.setLeft(null);
                } else { // if is rightNode
                    parent.setRight(null);
                }
                return;
            }

            // has only left node
            if (indexRoot.getLeft() != null && indexRoot.getRight() == null) {
                if (indexRoot == this.getRoot()) { // if deleted is root
                    setRoot(indexRoot.getLeft());
                    indexRoot = null;
                } else {
                    parent.setLeft(indexRoot.getLeft());
                    indexRoot.getLeft().setParent(parent);
                    indexRoot = null;
                }
                return;
            }

            // has only right node
            if (indexRoot.getLeft() == null && indexRoot.getRight() != null) {
                if (indexRoot == this.getRoot()) { // if deleted is root
                    setRoot(indexRoot.getRight());
                    indexRoot = null;
                } else {
                    parent.setRight(indexRoot.getRight());
                    indexRoot.getRight().setParent(parent);
                    indexRoot = null;
                }
                return;
            }

            // has two node
            if (indexRoot.getLeft() != null && indexRoot.getRight() != null) {

                // 找到删除节点的后继节点
                Node afterNode = indexRoot.getRight();
                Node afterFather = indexRoot;
                while (afterNode.getLeft() != null) {
                    afterFather = afterNode;
                    afterNode = afterNode.getLeft();
                }

                if (afterFather == indexRoot) {
                    parent.setRight(afterNode);
                    afterNode.setParent(parent);
                    afterNode.setLeft(indexRoot.getLeft());
                    indexRoot.getLeft().setParent(afterNode);
                    if (indexRoot == this.getRoot()) { //if delete is root
                        setRoot(afterNode);
                    }

                } else {
                    //比较复杂
                    if (afterNode.getRight() != null) {
                        afterFather.setLeft(afterNode.getRight());
                        afterNode.getRight().setParent(afterFather);
                    } else {
                        afterFather.setLeft(null);
                    }
                    afterNode.setRight(indexRoot.getRight());
                    indexRoot.getRight().setParent(afterNode);
                    parent.setRight(afterNode);
                    afterNode.setParent(parent);
                    afterNode.setLeft(indexRoot.getLeft());
                    indexRoot.getLeft().setParent(afterNode);
                    if (indexRoot == this.getRoot()) {
                        this.setRoot(afterNode);
                    }
                }
                indexRoot = null;
            }
        }
    }

    public class Node {
        private Node left;
        private Node right;
        private int value;
        private Node parent;

        public Node(int v) {
            this.value = v;
        }

        public Node() {

        }

        public Node getLeft() {
            return left;
        }

        public void setLeft(Node left) {
            this.left = left;
        }

        public Node getRight() {
            return right;
        }

        public void setRight(Node right) {
            this.right = right;
        }

        public int getValue() {
            return value;
        }

        public void setValue(int value) {
            this.value = value;
        }

        public Node getParent() {
            return parent;
        }

        public void setParent(Node parent) {
            this.parent = parent;
        }
    }
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/hhh594521/article/details/52635483

智能推荐

苹果快捷键怎么调出来_原来还有这么好用的CAD快捷键,文末附赠快捷键鼠标垫!留言走起...-程序员宅基地

文章浏览阅读141次。▼相信大家都看过一些大神做CAD,那个图纸真是做的又快又好看!当然大神们其实也就基础好一点,把快捷键记得过目不忘,所以接下来小编就教大家一个非常Skr的方法,保证你对这些快捷键过目不忘,文末更有免费鼠标垫领取,千万别错过哦!这个方法就是建立我们的思维导图了,文字看了可能会忘记,但是通过导图的方式,就会变成思维图形,更加符合我们大脑的思考习惯,就可以牢牢记住这些快捷键啦:▼例如我们看到下面的就是绘图..._苹果cad快捷键

MATLAB的GUI 程序设计_制作一个曲面光照效果的演示界面,如图所示,三个弹出式菜单分别用于选择曲面形式、-程序员宅基地

文章浏览阅读7.2k次,点赞7次,收藏60次。第七章 MATLAB的GUI 程序设计Chapter 8: Design of MATLAB of GUI programGUI(Graphical User Interfaces):由各种图形对象组成的用户界面,在这种用户界面下,用户的命令和对程序的控制是通过“选择”各种图形对象来实现的。目前90%以上的应用程序和软件都是在GUI下运行的。MATLAB有两种GUI用户界面控件的创建方式,基于命令行的方式用程序来制作和基于GUI的方式制作。这里主要介绍基于GUI的方式。MATLAB 的._制作一个曲面光照效果的演示界面,如图所示,三个弹出式菜单分别用于选择曲面形式、

MT7628开发环境搭建_undefined reference to `llseek-程序员宅基地

文章浏览阅读2.1k次。参考openwrt 快速入门1.环境搭建1.1Ubuntu dockerhttps://www.runoob.com/docker/ubuntu-docker-install.html​1.1.1使用官方安装脚本自动安装安装命令如下:curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun​ps: 我已经放弃用deepin编译旧版openwrt ,修复了十几个bug还是有bug,无敌下载14.04版本docke_undefined reference to `llseek

13 Kubectl命令概览_kube_ps1关闭-程序员宅基地

文章浏览阅读81次。kubectx:用于切换kubernetes context kube-ps1:为命令行终端增加$PROMPT字段 kube-shell:交互式带命令提示的kubectl终端kube-shell开源项目kube-shell可以为kubectl提供自动的命令提示和补全,使用起来特别方便,推荐给大家。Kube-shell有以下特性:命令提示,给出命令的使用说明 自动补全,列出可选命令并可以通过tab键自动补全,支持模糊搜索 高亮 使用tab键可以列出可选的对象 vim模式M..._kube_ps1关闭

ensp各种报错积累(以及解决方法)_ensp配置路由地址时错误-程序员宅基地

文章浏览阅读1k次,点赞11次,收藏9次。此报错的意思是请续订默认配置,就是让你去一级一级的删除,首先删除你设置的允许vlan通过的命令,然后去取消掉更改的端口类型命令(就是在配置命令前面加一个undo),再去更改端口类型就成功了。此报错的意思是已经加入了接口,不能在修改模式,所以需要先去把端口全部删除,在修改模式即可成功。他的意思就是说这个IP地址已经配置了,不需要在配置了。2.修改链路聚合模式的时候。3.更改IP地址的时候。_ensp配置路由地址时错误

经典JS-序列号_ucfp:74a28a8b-b3fb-4602-ca5f-0ebdf880c1ff-16927960-程序员宅基地

文章浏览阅读10w+次。3D0E1D4E75686FA0FF1C6F6F626F6F6F6F6F6F6F8F381B2FFF2D6FEF396F6F6A1B6E6F6D762B39E3021B282C725C726F4F6F6F6F5F5F5C330E1F06251C335B5E0D580E5E095D575B0E56560B5F0B41051C6F9F4FCC60636EBE7FBE7A3E637EB613394327_ucfp:74a28a8b-b3fb-4602-ca5f-0ebdf880c1ff-1692796091560

随便推点

Accessing static Data and Functions in Legacy C_setyearanddayofyear-程序员宅基地

文章浏览阅读1.1k次。http://www.renaissancesoftware.net/blog/archives/430http://www.renaissancesoftware.net/blog/archives/450It’s a new year; last year was a leap year; so the quadrennial reports of leap y_setyearanddayofyear

vue把字符串分割成等长的若干字符串,根据特定字符分割字符串_vue 分割字符串-程序员宅基地

文章浏览阅读1.6w次,点赞2次,收藏20次。把字符串分割成等长的若干字符串,根据特定字符分割字符串_vue 分割字符串

朴素贝叶斯分类器的例子_朴素贝叶斯分类器 例子-程序员宅基地

文章浏览阅读1.1k次。一、病人分类的例子让我从一个例子开始讲起,你会看到贝叶斯分类器很好懂,一点都不难。某个医院早上收了六个门诊病人,如下表。  症状  职业   疾病  打喷嚏 护士   感冒   打喷嚏 农夫   过敏   头痛  建筑工人 脑震荡   头痛  建筑工人 感冒   打喷嚏 教师   感冒   头痛  教师   脑震荡现在又来了第七个病人,是一个打喷嚏的建筑工人。请问他患上感冒的概率有多大?根据贝叶斯..._朴素贝叶斯分类器 例子

当mysql数据库转换为sqlserver数据库时常见报错_mysql 数据导出在sqlserver不能用-程序员宅基地

文章浏览阅读527次。↵下面是我在把mysql数据库转换为sqlserver数据库时候遇到过的一些错,踩过的坑,把它总结下来防止以后再出错。报错 1:com.microsoft.sqlserver.jdbc.SQLServerException: 仅当使用了列列表并且 IDENTITY_INSERT 为 ON 时,才能为表'user_student'中的标识列指定显式值。出错原因:当mysql数据库转换为sqlserver数据库时,如果第一个id设置为自动递增,那么String sql = "..._mysql 数据导出在sqlserver不能用

LeetCode 刷题常用数据结构(Java 中的实现)_javalist集合map组合刷题 leetcode-程序员宅基地

文章浏览阅读1.9k次,点赞4次,收藏27次。记录常用数据结构(栈、队列、数组、列表、字符串、集合等),在 Java 中如何使用它的实现类。_javalist集合map组合刷题 leetcode

Visual Studio Code 设置成中文_visualstudiocode中文-程序员宅基地

文章浏览阅读6.7k次,点赞5次,收藏4次。Visual Studio Code 编辑器设置成中文 分2个步骤1、【查看】--【扩展】(Ctrl+Shift+X) 在扩展:商店中输入Chinese,搜索到 适用于 VS Code 的中文(简体)语言包,点击安装; 2、Ctrl+Shift+P,调出搜索框,输入 Configure Display Language,选中此配置项; 把配置页面中的"..._visualstudiocode中文