二叉树

每个节点都不能有多于两个的儿子。

二叉树的五个性质

1.在二叉树的第i层上最多有2 i-1 个节点 。(i>=1)

2.二叉树中如果深度为k,那么最多有2k-1个节点。(k>=1)

3.n0=n2+1  n0表示度数为0的节点 n2表示度数为2的节点

4.在完全二叉树中,具有n个节点的完全二叉树的深度为[log2n]+1,其中[log2n]+1是向下取整。


5.若对含 n 个结点的完全二叉树从上到下且从左至右进行 1 至 n 的编号,则对完全二叉树中任意一个编号为 i 的结点:

(1) 若 i=1,则该结点是二叉树的根,无双亲, 否则,编号为 [i/2] 的结点为其双亲结点;  

(2) 若 2i>n,则该结点无左孩子,  否则,编号为 2i 的结点为其左孩子结点;

(3) 若 2i+1>n,则该结点无右孩子结点,  否则,编号为2i+1 的结点为其右孩子结点。

二叉查找树

二叉查找树的性质是:对于树中的x节点,其左子树的所有项都小于x节点的值,右子树的所有项都大于x节点的值。

二叉查找树的平均深度为O(logN)

代码表示

节点类

package tree;

/**
 * Created by wuchao on 17-4-7.
 */
//定义二叉树的节点对象
public class BinaryNode implements Comparable<BinaryNode>{
    BinaryNode(int element){
        this.element = element;
    }
    BinaryNode(int element, BinaryNode nodeLeft, BinaryNode nodeRight){
        this.element = element;
        this.left = nodeLeft;
        this.right = nodeRight;
    }
    int element;
    BinaryNode left;
    BinaryNode right;
    @Override
    public int compareTo(BinaryNode node) {
        return this.element-node.element;
    }
}

 查找树

package tree;

/**
 * Created by wuchao on 17-4-7.
 */
//二叉查找树
public class BinarySearchTree {
    private BinaryNode root;

    //构造方法
    public BinarySearchTree(){
        root=null;
    }
    //清空二叉树
    public void makeEmpty(){
        root=null;
    }
    //判断二叉树是否为空
    public boolean isEmpty(){
        return root==null;
    }
    //判断是否包含某个值
    public boolean contains(int value){
        return contains(value,root);
    }
    //查找最小值
    public int findMin()throws Exception{
        if(root==null)  throw new Exception("树为空!");
        return findMin(root).element;
    }
    //查找最大值
    public int findMax()throws Exception{
        if(root==null)  throw new Exception("树为空!");
        return findMax(root).element;
    }
    //插入
    public void insert(int x){
        root = insert(root,x);
    }
    //移除
    public void remove(int x){
        root = remove(root,x);
    }

    private boolean contains(int value,BinaryNode root){
        if(root==null) return false;

        if(root.element>value){
            return contains(value,root.left);
        }else if(root.element<value){
            return contains(value,root.right);
        }else{
            return true;
        }
    }

    private BinaryNode findMin(BinaryNode root){
        if(root == null) return null;
        if(root.left == null) return root;
        return findMin(root.left);
    }

    private BinaryNode findMax(BinaryNode root){
        if(root == null) return null;
        if(root.right == null) return root;
        return findMin(root.right);
    }

    private BinaryNode insert(BinaryNode root,int x){
        if(root == null) return new BinaryNode(x,null,null);

        if(x<root.element){
            root.left = insert(root.left,x);
        }else if(x>root.element){
            root.right = insert(root.right,x);
        }else{
            //如果树中有重复的值,则不操作
        }
        return root;
    }

    /*
    删除分为三种情况
    1)删除的节点是叶子
    2)删除的节点只有一个子节点
    3)删除的节点有两个子节点
    第三种情况较为复杂,删除策略是用其右子树的最小数据代替该节点的数据,并递归删除那个节点(最小数据)。
     */
    private BinaryNode remove(BinaryNode root,int x){
        if(root == null) return root;

        if(x<root.element){
            root.left = remove(root.left,x);
        }else if(x>root.element){
            root.right = remove(root.right,x);
        }else if(root.left != null && root.right !=null){
            root.element = findMin(root.right).element;
            root.right = remove(root.right,root.element);
        }else{
            root = (root.left != null)? root.left:root.right;
        }
        return root;
    }
}

AVL树(平衡树)

一棵AVL树是其每个节点的左子树和右子树的高度最多差1的二叉查找树。

 
posted @ 2017-04-07 14:14  且听风吟-wuchao  阅读(173)  评论(0编辑  收藏  举报