您的位置:首页 > 其它

查找二叉树

2015-10-02 15:45 218 查看
什么是二叉树?
二叉树是一个每个结点至多只有两个子结点的树

二叉树的实现

二叉树的每个结点必须包含三个信息:1、结点所代表的元素   2、左边的子节点(若没有左子节点则为null)  3、右边的子节点(若没有右子节点则为null)。每个结点的结构如下所示:



什么是查找二叉树?

查找二叉树是一种特殊的二叉树它满足:对于树中的每个结点X,它的左子树中所有项的值小于X的值,而他右子树中所有项的值大于X的值

查找二叉树的实现代码

包含了插入、删除操作

class BinarySearchTree<T>
{

private Comparator<? super T> cmp;
private BinaryNode<T> root;
private static class BinaryNode<T>
{
BinaryNode<T> left;
BinaryNode<T> right;
T data;
public BinaryNode(BinaryNode<T> left,BinaryNode<T> right,T data)
{
this.left=left;
this.right=right;
this.data=data;
}
}

public BinarySearchTree()
{
this(null);
}

public BinarySearchTree(Comparator<T> cmp)
{
root=null;
this.cmp=cmp;
}

public void makeEmpty()
{
root=null;
}

public boolean isEmpty()
{
return root==null;
}

public T findMin()
{
if(findMin(root)==null)
{
return null;
}
return findMin(root).data;
}

public T findMax()
{
if(findMax(root)==null)
{
return null;
}
return findMax(root).data;
}

public void insert(T x)
{
insert(x, root);
}

public void remove(T x)
{
remove(x, root);
}

private void insert(T x,BinaryNode<T> t)
{
if (t==null)
{
root=new BinaryNode<T>(null, null, x);
return;
}

int comResult=compare(x, t.data);
if(comResult>0)
{
if (t.right==null)
{
t.right=new BinaryNode<T>(null, null, x);
return;
}
else
{
insert(x,t.right);
}

}
else if (comResult<0)
{
if (t.left==null)
{
t.left=new BinaryNode<T>(null, null, x);
return;
}
else {
insert(x,t.left);
}

}

}

private BinaryNode<T> remove(T x,BinaryNode<T> t)
{
if(t==null)
{
return null;
}
int comResult=compare(x, t.data);
if(comResult>0)
{
t.right=remove(x, t.right);
}
else if (comResult<0)
{
t.left=remove(x,t.left);
}
else if(t.left!=null && t.right!=null)
{
t.data=findMin(t.right).data;
t.right=remove(t.data,t.right);
/**
* 上面的语句可用下面两句替代
* t.data=findMax(t.left).data;
* t.left=remove(t.data,t.left);
*/
}
else
{
t=(t.left!=null) ? t.left : t.right;//
}
return t;
}

private BinaryNode<T> findMin(BinaryNode<T> b)
{
if(b==null)
{
return null;
}
else if(b.left==null)
{
return b;
}
return findMin(b.left);
}

private BinaryNode<T> findMax(BinaryNode<T> b)
{
if(b==null)
{
return null;
}
else if (b.right==null)
{
return b;
}
return findMax(b.right);
}

private int compare(T a,T b)
{
if (cmp!=null)
{
return cmp.compare(a, b);
}
else {
return ((Comparable)a).compareTo(b);
}
}
/****************************下面的代码是为了打印出二叉树,不属于二叉树的具体实现********************/
//层序遍历
public void printTree()
{
Queue<BinaryNode<T>> queue=new LinkedList<BinaryNode<T>>();
queue.offer(root);
BinaryNode<T> node;
int current=0;
int last=0;
while (!queue.isEmpty())
{
last=queue.size();
current=0;
while (current<last)
{
node=queue.poll();
System.out.print(node.data+" ");
if(node.left!=null)
{
queue.offer(node.left);
}
if (node.right!=null)
{
queue.offer(node.right);
}
current++;
}
System.out.println();
}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: