现在的位置: 首页 > 综合 > 正文

树——二叉查找树

2018年02月05日 ⁄ 综合 ⁄ 共 3947字 ⁄ 字号 评论关闭

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

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后的二叉查找树

   

抱歉!评论已关闭.