您的位置:首页 > 编程语言 > Java开发

二叉查找树的构造与遍历[Java实现]

2012-11-14 16:13 731 查看
构造二叉查找树之插入算法:

比较新节点关键字与格子树根节点的大小关系。如果新节点关键字小,则递归进入相应根节点的左子树,直到找到左子树为空的位置;否则,递归进入相应根节点的右子树,直到找到右子树为空的位置。

树节点:

[java]
view plaincopyprint?

package org.pbdevj.ds.search.binarysearchtree;

import java.io.Serializable;

/**树节点*/
public class TreeNode
implements Serializable {

public Object nodeValue;//数据域

public TreeNode lChild;//左子树

public TreeNode rChild;//右子树

public TreeNode() {
// TODO Auto-generated constructor stub

}

public TreeNode(Object nodeValue, TreeNode lChild, TreeNode rChild) {

super();
this.nodeValue = nodeValue;

this.lChild = lChild;

this.rChild = rChild;

}

}

[java]
view plaincopyprint?

package org.pbdevj.ds.search.binarysearchtree;

/**查找回调接口*/

public interface ISearchCallBack {

void visit(TreeNode e);

}

package org.pbdevj.ds.search.binarysearchtree;

/**查找回调接口*/
public interface ISearchCallBack {

void visit(TreeNode e);

}


查找接口:

[java]
view plaincopyprint?

package org.pbdevj.ds.search.binarysearchtree;

/**查找接口*/

public interface ISearch {

TreeNode search(Object e);

TreeNode search(Object e,ISearchCallBack searchCallBack);

void output(ISearchCallBack searchCallBack);

}

[java]
view plaincopyprint?

package org.pbdevj.ds.search.binarysearchtree;

/**二叉查找树*/

public class BinarySearchTree
implements ISearch {

private Object[] elements;

TreeNode rootNode;//树根节点

public BinarySearchTree(Object[] elements) {

// TODO Auto-generated constructor stub

this.elements = elements;

buildBinarySearchTree();
}

public BinarySearchTree(TreeNode rootNode) {

// TODO Auto-generated constructor stub

this.rootNode = rootNode;

}

/**构造二叉查找树*/
private void buildBinarySearchTree(){

if(elements==null || elements.length==0)

return;

rootNode =new TreeNode(elements[0],null,null);

if (elements.length==1)

return;

for (int index =
1; index < elements.length; index++) {//每次循环从数组中取一个元素

TreeNode tempNode = rootNode;
while(true){//将这个元素与左子树或右子树循环比较,小于则继续进入左子树的左子树,否则继续进入右子树的右子树

if (elements[index].toString().compareTo(tempNode.nodeValue.toString())<0){//小于中间节点

if (tempNode.lChild==null){

tempNode.lChild = new TreeNode(elements[index],null,null);

break;
}
tempNode = tempNode.lChild;//继续比较左子树

} else {
if (tempNode.rChild==null){

tempNode.rChild = new TreeNode(elements[index],null,null);

break;
}
tempNode = tempNode.rChild;//继续比较右子树

}
}
}

}

/**中序输出这个二叉查找树*/
@Override

public void output(ISearchCallBack searchCallBack) {

// TODO Auto-generated method stub

if (rootNode==null)

return;

_output(rootNode,searchCallBack);
}

/**中序输出这个二叉查找树[递归函数]*/

private void _output(TreeNode node,ISearchCallBack searchCallBack){

if (node.lChild!=null)//遍历左子树

_output(node.lChild,searchCallBack);
if (searchCallBack!=null)//访问根节点

searchCallBack.visit(node);
if (node.rChild!=null)//遍历右子树

_output(node.rChild,searchCallBack);
}

@Override
public TreeNode search(Object e) {

// TODO Auto-generated method stub

return null;

}

@Override
public TreeNode search(Object e, ISearchCallBack searchCallBack) {

// TODO Auto-generated method stub

return null;

}

}

package org.pbdevj.ds.search.binarysearchtree;

/**二叉查找树*/
public class BinarySearchTree implements ISearch {

private Object[] elements;

TreeNode rootNode;//树根节点

public BinarySearchTree(Object[] elements) {
// TODO Auto-generated constructor stub
this.elements = elements;
buildBinarySearchTree();
}

public BinarySearchTree(TreeNode rootNode) {
// TODO Auto-generated constructor stub
this.rootNode = rootNode;
}

/**构造二叉查找树*/
private void buildBinarySearchTree(){
if(elements==null || elements.length==0)
return;

rootNode =new TreeNode(elements[0],null,null);
if (elements.length==1)
return;

for (int index = 1; index < elements.length; index++) {//每次循环从数组中取一个元素
TreeNode tempNode = rootNode;
while(true){//将这个元素与左子树或右子树循环比较,小于则继续进入左子树的左子树,否则继续进入右子树的右子树
if (elements[index].toString().compareTo(tempNode.nodeValue.toString())<0){//小于中间节点
if (tempNode.lChild==null){
tempNode.lChild = new TreeNode(elements[index],null,null);
break;
}
tempNode = tempNode.lChild;//继续比较左子树
} else {
if (tempNode.rChild==null){
tempNode.rChild = new TreeNode(elements[index],null,null);
break;
}
tempNode = tempNode.rChild;//继续比较右子树
}
}
}

}

/**中序输出这个二叉查找树*/
@Override
public void output(ISearchCallBack searchCallBack) {
// TODO Auto-generated method stub
if (rootNode==null)
return;

_output(rootNode,searchCallBack);
}

/**中序输出这个二叉查找树[递归函数]*/
private void _output(TreeNode node,ISearchCallBack searchCallBack){
if (node.lChild!=null)//遍历左子树
_output(node.lChild,searchCallBack);
if (searchCallBack!=null)//访问根节点
searchCallBack.visit(node);
if (node.rChild!=null)//遍历右子树
_output(node.rChild,searchCallBack);
}

@Override
public TreeNode search(Object e) {
// TODO Auto-generated method stub
return null;
}

@Override
public TreeNode search(Object e, ISearchCallBack searchCallBack) {
// TODO Auto-generated method stub
return null;
}

}


单元测试:

[java]
view plaincopyprint?

package org.pbdevj.ds.search.binarysearchtree.utest;

import org.junit.Before;

import org.junit.Test;

import org.pbdevj.ds.search.binarysearchtree.BinarySearchTree;

import org.pbdevj.ds.search.binarysearchtree.ISearch;

import org.pbdevj.ds.search.binarysearchtree.ISearchCallBack;

import org.pbdevj.ds.search.binarysearchtree.TreeNode;

public class BinarySearchTreeTest {

@Test
public void testOutput(){

ISearch search = new BinarySearchTree(new Object[]{

50,30,10,20,60,90,70,45,43,32,38,44,21,20,55,65,67,76,77,88,77

});
search.output(new ISearchCallBack() {

@Override
public void visit(TreeNode e) {

// TODO Auto-generated method stub

System.out.println(e.nodeValue);

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