二叉查找树的构造与遍历[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 ISearch {
TreeNode search(Object e);
TreeNode search(Object e,ISearchCallBack searchCallBack);
void output(ISearchCallBack searchCallBack);
}
单元测试:
[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);
}
});
}
}
比较新节点关键字与格子树根节点的大小关系。如果新节点关键字小,则递归进入相应根节点的左子树,直到找到左子树为空的位置;否则,递归进入相应根节点的右子树,直到找到右子树为空的位置。
树节点:
[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);
}
});
}
}
相关文章推荐
- 二叉查找树的构造与遍历[Java实现]
- 二叉树实现(构造,遍历)-java
- 二叉查找树(查询、插入、遍历、删除)--Java实现
- Java实现二叉查找树的创建、查找、插入、删除、遍历
- java构造二叉树并且实现先,中,后序遍历
- java实现二叉查找树(插入、删除、遍历、查找)
- java使用递归,非递归方式实现二叉树的三种常见遍历方式
- 【LeetCode-面试算法经典-Java实现】【107-Binary Tree Level Order Traversal II(二叉树层序遍历II)】
- java 实现图的宽度优先遍历
- java实现二叉树的遍历
- 二叉树的层次遍历----java实现
- 邻接表存储图,DFS遍历图的java代码实现
- java实现二叉树的中序遍历和后续遍历
- 二叉树的三种遍历方式java实现
- [Java算法分析与设计]二叉树非递归实现遍历
- AVL树-自平衡二叉查找树(Java实现)
- Java实现:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。
- java非递归实现Xml的遍历(多叉树遍历)
- java实现遍历树形菜单方法——实体类VoteTree
- JAVA实现文件遍历