• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

cynchanpin

  • 博客园
  • 联系
  • 订阅
  • 管理

View Post

<html>

先看看实现了哪些功能吧?
(1)构造二叉树
(2)遍历二叉树结点
(3)搜索二叉树结点
(4)删除二叉树结点
(5)推断结点是否存在二叉树

看看源代码:
package hk.inso.service;

/**
 * Created by IntelliJ IDEA.
 * Date: 8/17/15 11:45 PM
 * Author: Richard
 */
public class BinarySearchTree {

    /**
     * 根结点,是全部遍历的入口
     */
    private Node root = null;
    private StringBuilder stringBuilder = new StringBuilder();

    /**
     * 插入一个元素
     * @param value
     */
    public void add(int value) {
        Node node = new Node();
        node.setValue(value);
        insert(node);
    }

    /**
     * 显示root
     * @return
     */
    public String getRoot() {
        return "Root{ " + root.value + " }";
    }

    /**
     * 移除一个特定的元素
     * @param value
     */
    public void remove(int value) {
        Node node = new Node();
        node.setValue(value);
        delete(node);
    }

    /**
     * 获取某个元素
     * @param value
     * @return
     */
    public String get(int value) {
        Node node = new Node();
        node.setValue(value);
        Node resultNode = search(node);
        return "parent: " + resultNode.parent + " left: " +
                resultNode.left + " right: " + resultNode.right;
    }

    /**
     * 推断是否包括某个元素
     * @param value
     * @return
     */
    public boolean contains(int value) {
        Node node = new Node();
        node.setValue(value);
        Node resutlNode = search(node);
        if (resutlNode == null) {
            return false;
        }
        return true;
    }

    /**
     * 先序遍历树,输出所有元素
     * @return
     */
    @Override
    public String toString(){
        //非常重要,flush StringBuilder对象
        stringBuilder = new StringBuilder();
        StringBuilder sb = new StringBuilder();
        sb.append("BSTree{ ");
        String midString = midTraverse(root);
        //String midString = preTraverse(root);
        //String midString = postTraverse(root);
        int index = midString.lastIndexOf(", ");
        midString = midString.substring(0, index);
        sb.append(midString);
        sb.append(" }");
        return sb.toString();
    }

    /**
     * 中序遍历树结构
     * @param node
     * @return
     */
    private String midTraverse(Node node) {

        if (node == null) {
            return null;
        }
        midTraverse(node.left);
        stringBuilder.append(node.value + ", ");
        midTraverse(node.right);
        return stringBuilder.toString();
    }

    /**
     * 先序遍历树结构
     * @param node
     * @return
     */
    private String preTraverse(Node node) {
        if (node == null) {
            return null;
        }
        stringBuilder.append(node.value + ", ");
        preTraverse(node.left);
        preTraverse(node.right);
        return  stringBuilder.toString();
    }

    /**
     * 后序遍历树结构
     * @param node
     * @return
     */
    private String postTraverse(Node node) {
        if (node == null) {
            return null;
        }
        postTraverse(node.left);
        postTraverse(node.right);
        stringBuilder.append(node.value + ", ");
        return stringBuilder.toString();
    }

    /**
     * 插入结点到二叉查找树
     * @param node
     */
    private void insert(Node node){

        if (root == null) {
            root = node;
        }
        else {
            boolean flag = true;
            Node iteratorNode = root;
            while (flag) {
                //无子结点
                if (iteratorNode.left == null && iteratorNode.right == null) {
                    appendNode(node, iteratorNode);
                    flag = false;
                }
                //有子结点
                else {
                    //插入比当前结点小的结点
                    if (node.value < iteratorNode.value) {
                        if (iteratorNode.left == null) {
                            appendNode(node, iteratorNode);
                            flag = false;
                        } else {
                            iteratorNode = iteratorNode.left;
                        }
                    }
                    //插入比当前结点大的结点
                    else {
                        if (iteratorNode.right == null) {
                            appendNode(node, iteratorNode);
                            flag = false;
                        } else {
                            iteratorNode = iteratorNode.right;
                        }
                    }
                }
            }
        }
    };

    /**
     * 加入子结点
     * @param node
     * @param parent
     */
    private void appendNode(Node node, Node parent) {

        if (node.value < parent.value) {
            parent.left = node;
            node.parent = parent;
        }
        else {
            parent.right = node;
            node.parent = parent;
        }
    }

    /**
     * 删除结点
     * @param node
     */
    private void delete(Node node){
        //找到该结点
        Node resultNode = search(node);

        if (resultNode.value == root.value) {
            if (resultNode.left != null && resultNode.right != null) {
                Node maxNode = getMaxNode(resultNode.left);
                maxNode.right = resultNode.right;
                resultNode.right.parent = maxNode;
                root = resultNode.left;
            } else if (resultNode.left == null && resultNode.right != null) {
                root = resultNode.right;
            } else if (resultNode.right == null && resultNode.left != null) {
                root = resultNode.left;
            } else if (resultNode.right == null && resultNode.left == null) {
                root = null;
            }
        }

        else if (resultNode.left == null && resultNode.right == null) {
            if (resultNode.isLeft()) {
                resultNode.parent.left = null;
            }
            else {
                resultNode.parent.right = null;
            }
        }

        else if (resultNode.left != null && resultNode.right == null) {
            if (resultNode.isLeft()) {
                resultNode.parent.left = resultNode.left;
            }
            else {
                resultNode.parent.right = resultNode.left;
            }
            resultNode.left.parent = resultNode.parent;
        }

        else if (resultNode.left == null && resultNode.right != null) {
            if (resultNode.isLeft()) {
                resultNode.parent.left = resultNode.right;
            }
            else {
                resultNode.parent.right = resultNode.right;
            }
            resultNode.right.parent = resultNode.parent;
        }

        /**
         * 将当前结点的右孩子连接到左子树的最大子结点。并作为这个最大子结点的右孩子
         */
        else if (resultNode.left != null && resultNode.right != null) {
            if (resultNode.isLeft()) {
                resultNode.left.parent = resultNode.parent;
                resultNode.parent.left = resultNode.left;
                Node maxNode = getMaxNode(resultNode.left);
                maxNode.right = resultNode.right;
                resultNode.right.parent = maxNode;
            } else {
                resultNode.left.parent = resultNode.parent;
                resultNode.parent.right = resultNode.left;
                Node maxNode = getMaxNode(resultNode.left);
                maxNode.right = resultNode.right;
                resultNode.right.parent = maxNode;

            }
        }
    };

    /**
     * 查找某个元素
     * @param node
     * @return
     */
    private Node search(Node node){
        Node iteratorNode = root;
        if (node == null || iteratorNode == null) {
            return null;
        }
        boolean flag = true;
        while (flag) {

            if (node != null && iteratorNode != null && node.value < iteratorNode.value) {
                if (iteratorNode.isLeaf()){
                    node = null;
                    flag = false;
                }
                else {
                    iteratorNode = iteratorNode.left;
                }

            }
            if (node != null && iteratorNode != null && node.value > iteratorNode.value) {
                if (iteratorNode.isLeaf()){
                    node = null;
                    flag = false;
                }
                else {
                    iteratorNode = iteratorNode.right;
                }

            }
            //一定要分析清楚这个地方
            if (node != null && iteratorNode != null && node.value == iteratorNode.value) {
                node = iteratorNode;
                flag = false;
            }

            if (iteratorNode == null || node == null) {
                node = null;
                flag = false;
            }
        }
        return node;
    };

    /**
     * 获取当前结点作为根的树下最小值的结点
     * @param node
     * @return
     */
    private Node getMinNode(Node node) {
        Node iteratorNode = node;
        while (iteratorNode.left != null) {
            iteratorNode = iteratorNode.left;
        }
        return iteratorNode;
    }

    /**
     * 获取当前结点作为根的树下最大值的结点
     * @param node
     * @return
     */
    private Node getMaxNode(Node node) {
        Node iteratorNode = node;
        while (iteratorNode.right != null) {
            iteratorNode = iteratorNode.right;
        }
        return iteratorNode;
    }

    /**
     * 内部类,树结点
     */
    class Node{

        private Node parent = null;
        private Node left = null;
        private Node right = null;
        private int value = 0;

        public Node(Node parent, Node left, Node right, int value) {
            this.parent = parent;
            this.left = left;
            this.right = right;
            this.value = value;
        }

        public Node() {
            //constructor without args
        }

        public Node getParent() {
            return parent;
        }

        public void setParent(Node parent) {
            this.parent = parent;
        }

        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;
        }

        /**
         * 是否为左孩子
         * @return
         */
        public boolean isLeft() {
            if (this.parent.left != null && this.value == this.parent.left.value) {
                return true;
            }
            return false;
        }

        /**
         * 是否为叶子结点
         * @return
         */
        public boolean isLeaf() {
            if (this.left == null && this.right == null) {
                return true;
            }
            return false;
        }

        @Override
        public String toString() {
            return "Node{" +
                    "value=" + value +
                    "}";
        }
    }
}

測试代码:
public class TestBinarySearchTree {

    private static BinarySearchTree binarySearchTree = new BinarySearchTree();

    public static void main(String[] args) {

        binarySearchTree.add(14);
        binarySearchTree.add(20);
        binarySearchTree.add(7);
        binarySearchTree.add(11);
        binarySearchTree.add(19);
        binarySearchTree.add(2);
        binarySearchTree.add(44);
        binarySearchTree.add(32);
        binarySearchTree.add(4);

        binarySearchTree.remove(32);
        System.out.println(binarySearchTree.toString());
        System.out.println(binarySearchTree.contains(32));
    }
}

结果:
BSTree{ 2, 4, 7, 11, 14, 19, 20, 44 }
false

以上源代码所相应的结点的值均为Int型。假设你感兴趣,能够更改源代码,扩展它的类型。以上代码均通过測试。



阅读全文
版权声明:本文为博主原创文章。未经博主同意不得转载。 举报
  • 标签:
  • contains /
  • BST /
  • 二叉树 /
  • 实现 /
  • 本文已收录于下面专栏:
0条评论
发表评论
HTML/XML objective-c Delphi Ruby PHP C# C++ JavaScript Visual Basic Python Java CSS SQL 其他

相关文章推荐

树形结构_数据库_利用递归遍历一棵仅仅知道父节点的树

遍历一棵仅仅知道父节点的树
  • u010003835
  • u010003835
  • 2016-02-26 10:38
  • 1929

【树形递归】

C#树形递归,部门树状图 假设数据库中存在的department部门表,当中ID为主键,PID为父类,Name为部门名称,设计例如以下: public class department {...
  • heyangyi_19940703
  • heyangyi_19940703
  • 2016-05-20 16:25
  • 1370

二叉树查找树的基本操作

一、什么是二叉查找树: 顾名思义,一棵二叉查找树是以一棵树的形式组织起来的,如图一所看到的。其能够使用一个链表数据结构来表示, 当中每一个节点就是就是一个对象。除了包括数据域之外还包括属性lch...
  • heart_love
  • heart_love
  • 2016-03-21 10:21
  • 2237

查找之二叉树查找

1.      查找树的创建(createTree) 如果有例如以下数组4,1,45,78,345,23,12,3,6,21 首先选定4为root。然后遍历剩下的数字,假设大于等于4则放到4的右側。小...
  • TODD911
  • TODD911
  • 2013-01-06 09:43
  • 19526

创建搜索二叉树

二叉搜索树:对于树中的每一个节点,它的左子树中全部节点的值都小于父结点,右子树全部值都大于父结点。 创建实现: #include #include #include using namespace ...
  • xiaocherry1128
  • xiaocherry1128
  • 2017-07-31 11:38
  • 20

找到二叉树中的最大搜索二叉树

题目 给定一颗二叉树。已知当中全部节点的值都不一样,找到含有节点最多的二叉搜索树。并返回头节点。 注:一个二叉树的子树的叶节点必须是该二叉树的叶节点。

解答:...

  • u010005161
  • u010005161
  • 2016-09-14 17:51
  • 352

具体解释二叉查找树算法的实现

參考文献: 《数据结构(C语言版)》  严蔚敏 吴伟民 编著       开发平台:Ubuntu11.04     编译器:gcc version4.5.2 (Ubuntu/Linaro 4.5...
  • npy_lp
  • npy_lp
  • 2012-04-06 13:32
  • 59394

搜索二叉树

二叉树的基本问题: 二叉树是递归定义的,因此相关问题基本都能够用递归实现。递归在本质上就是一个栈。

二叉搜索树:对于树中的每一个节点X,它的左子树中全部项的值都小于X,右子树全部值都大于X。 定义一...

  • u010293702
  • u010293702
  • 2015-04-06 17:09
  • 556

Matlab代码实现SOM(自组织映射)算法

som可用于聚类。图像切割等,因为论文须要matlab实现了som。

%som实现 %2016-11-12 %by wangbaojia % som原理及參数说明 % 1.竞争:匹配最佳神经元----...

  • bwangk
  • bwangk
  • 2016-11-23 09:03
  • 3490

搜索二叉树的实现

要模拟实现搜索二叉树,必须了解他的性质: 搜索二叉树的性质: 1。每一个节点都有一个用于搜索的关键码,每一个节点的关键码都不一样; 2,一个节点的左子树上全部的关键码总是小于它。而右子树的关键总是大...
  • Pg_dog
  • Pg_dog
  • 2017-06-04 23:40
  • 90

心灵港

+关注
原创
100
粉丝
25
喜欢
0
  • 博客转移声明
  • 二进制原码,反码以及补码实战
  • Hadoop启动时SSH免password登录
很多其它文章

在线课程

【直播】机器学习&数据挖掘7周实训--韦玮
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理project师顺利通关--徐朋
【套餐】系统集成项目管理project师顺利通关--徐朋
  • 微博
    微信
    QQ
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原文地址:
原因补充:

(最多仅仅同意输入30个字)

posted on 2017-08-15 17:46  cynchanpin  阅读(651)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3