树
二叉树
每个节点都不能有多于两个的儿子。
二叉树的五个性质
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的二叉查找树。
联系方式:wuchaodzxx@126.com

浙公网安备 33010602011771号