树——二叉查找树

来源:互联网 发布:python 分词工具 编辑:程序博客网 时间:2024/06/07 20:01

      当进行插入,删除和查找操作中,二叉查找树的性能比迄今为止所研究的任何一种数据结构都好。

1. 二叉查找树:是一棵二叉树,它可以为空,也可以不为空,有如下的性质:

     1). 每个元素都有关键字,并且关键字是唯一的。

      2) 非空左子树的关键字值一定小于其子树根结点的关键字值。

     3) 非空右子树的关键字值一定大于其子树根结点的关键字值。

     4)左,右子树仍然是二叉查找树。

   简言之就是左孩子要小于父亲,右孩子要大于父亲。示例如下:


下面以上图为例,说明对二叉查找树的各种操作;


2. 二叉查找树的查找

package com.lyj.binary_search_tree;public class BStree {    /**     * @param args     */    public static void main(String[] args) {        // 初始化结点        BTNode n1 = new BTNode(8);        BTNode n2 = new BTNode(3);        BTNode n3 = new BTNode(10);        BTNode n4 = new BTNode(1);        BTNode n5 = new BTNode(6);        BTNode n6 = new BTNode(14);        BTNode n7 = new BTNode(4);        BTNode n8 = new BTNode(7);        BTNode n9 = new BTNode(13);        // n1的左右子树,后面同理        n1.setLeftChild(n2);        n1.setRightChild(n3);        n2.setLeftChild(n4);        n2.setRightChild(n5);        n3.setRightChild(n6);        n5.setLeftChild(n7);        n5.setRightChild(n8);        n6.setLeftChild(n9);        BTTreeOption btTreeOption = new BTTreeOption();        // 查找测试        // BTNode resultNode = btTreeOption.query(n1, 14);        // System.out.println(resultNode.getValue());        // 插入测试        // btTreeOption.insert(n1, 80);        // BTNode resultNode1 = btTreeOption.query(n1, 14);        // System.out.println(resultNode1.getRightChild().getValue());        // btTreeOption.insert(n1, 5);        // BTNode resultNode2 = btTreeOption.query(n1, 4);        // System.out.println(resultNode2.getRightChild().getValue());        // 查找最小元素        // BTNode minElement = btTreeOption.queryMin(n1);        // System.out.println(minElement.getValue());        // 查找最大元素        // BTNode minElement = btTreeOption.queryMax(n1);        // System.out.println(minElement.getValue());        // 删除测试        // btTreeOption.insert(n1, 80);        // BTNode resultNode1 = btTreeOption.query(n1, 14);        // System.out.println(resultNode1.getRightChild().getValue());        // btTreeOption.delete(n1, 80);        // System.out.println(resultNode1.getRightChild()== null);    }}/* * 结点 */class BTNode {    private int value;    private BTNode leftChild, rightChild;    public BTNode() {        value = 0;        leftChild = null;        rightChild = null;    }    public BTNode(int value, BTNode leftChild, BTNode rightChild) {        this.value = value;        this.leftChild = leftChild;        this.rightChild = rightChild;    }    public BTNode(int value) {        this(value, null, null);    }    public BTNode getLeftChild() {        return leftChild;    }    public void setLeftChild(BTNode leftChild) {        this.leftChild = leftChild;    }    public BTNode getRightChild() {        return rightChild;    }    public void setRightChild(BTNode rightChild) {        this.rightChild = rightChild;    }    public int getValue() {        return value;    }    public void setValue(int value) {        this.value = value;    }}/* * 二叉查找树的操作 */class BTTreeOption {    // 查找    public BTNode query(BTNode rootNode, int key) {        if (rootNode != null) {            if (key == rootNode.getValue()) {                return rootNode;            } else if (key < rootNode.getValue()) {                // 用于insert操作时返回最后一个结点,在insert中将新结点作为返回结点的左孩子                if (rootNode.getLeftChild() == null) {                    return rootNode;                }                return query(rootNode.getLeftChild(), key);            } else {                // 用于insert操作时返回最后一个结点,在insert中将新结点作为返回结点的右孩子                if (rootNode.getRightChild() == null) {                    return rootNode;                }                return query(rootNode.getRightChild(), key);            }        }        return null;    }    // 插入    public void insert(BTNode rootNode, int num) {        BTNode temp = query(rootNode, num);        if (temp != null) {            BTNode newNode = new BTNode(num);            // 选择把这个结点插在最后结点的哪一边            if (temp.getValue() > num) {                temp.setLeftChild(newNode);            } else {                temp.setRightChild(newNode);            }        }    }    // 删除    public BTNode delete(BTNode rootNode, int num) {        if (rootNode != null) {            if (num < rootNode.getValue()) {                rootNode.setLeftChild(delete(rootNode.getLeftChild(), num));            } else if (num > rootNode.getValue()) {                rootNode.setRightChild(delete(rootNode.getRightChild(), num));            } else if ((rootNode.getLeftChild() != null) && (rootNode.getRightChild() != null)) {                // 用右子树的最小值代替                BTNode tempNode = queryMax(rootNode.getRightChild());                rootNode.setValue(tempNode.getValue());                rootNode.setRightChild(delete(rootNode.getRightChild(), rootNode.getValue()));            } else {                // 有0个或1个孩子                if (rootNode.getLeftChild() == null) {                    rootNode = rootNode.getRightChild();                } else if (rootNode.getRightChild() == null) {                    rootNode = rootNode.getLeftChild();                }            }            return rootNode;        }        return null;    }    // 查找最小元素 递归实现    public BTNode queryMin(BTNode rootNode) {        if (rootNode != null) {            if (rootNode.getLeftChild() == null) {                return rootNode;            } else {                return queryMin(rootNode.getLeftChild());            }        }        return null;    }    // 查找最大元素 非递归实现    public BTNode queryMax(BTNode rootNode) {        if (rootNode != null) {            while (rootNode.getRightChild() != null) {                rootNode = rootNode.getRightChild();            }            return rootNode;        }        return null;    }}


                                                          插入5和80后的二叉查找树

   

原创粉丝点击