码迷,mamicode.com
首页 > 其他好文 > 详细

数据结构之树和二叉树实现

时间:2015-03-04 19:29:46      阅读:134      评论:0      收藏:0      [点我收藏+]

标签:数据结构   树和二叉树   java   

二叉树

二叉树的抽象数据类型的接口定义

public interface BinaryTree
{
	final String []mode={"preOrder","inOrder","postOrder","levelOrder"};
	boolean createBTree(String gt);
	boolean isEmpty();
	void traverseBTree(String s);
	Object findBTree(Object obj);
	int depthBTree();
	int countBTree();
	void printBTree();
	void clearBTree();
}

二叉树的顺序存储结构是不合适的,链接存储结构通常被采用。首先是二叉树的结点的定义。

public class BTreeNode{
	Object element;
	BTreeNode left,right;
	public BTreeNode(Object obj) {element=obj;left=right=null;}
	public BTreeNode(Object obj,BTreeNode lt,BTreeNode rt)
	{
		element=obj;left=lt;right=rt;
	}
}

具体实现

public class LinkBinaryTree implements BinaryTree
{
	protected BTreeNode root;
	public LinkBinaryTree(){
		root=null;
	}
	public LinkBinaryTree(BTreeNode rt){
		root=rt;
	}
	private void preOrder(BTreeNode rt)
	{
		if(rt!=null){
			System.out.print(rt.element+" ");
			preOrder(rt.left);
			preOrder(rt.right);
		}
	}
	private void inOrder(BTreeNode rt)
	{
		if(rt!=null){
			inOrder(rt.left);
			System.out.print(rt.element+" ");
			inOrder(rt.right);
		}
	}
	private void postOrder(BTreeNode rt)
	{
		if(rt!=null){
			postOrder(rt.left);
			postOrder(rt.right);
			System.out.print(rt.element+" ");
		}
	}
	private void levelOrder(BTreeNode rt)
	{
		Queue que=new SequenceQueue();
		BTreeNode p=null;
		que.enter(rt);
		while(!que.isEmpty()){
			p=(BTreeNode)que.leave();
			System.out.print(p.element+" ");
			if(p.left!=null) que.enter(p.left);
			if(p.right!=null) que.enter(p.right);
		}
	}
	private Object findBTree(BTreeNode rt)
	{
	}
	private int depthBTree(BTreeNode rt)
	{
	}
	private int countBTree(BTreeNode rt)
	{
	}
	private void printBTree(BTreeNode rt)
	{
	}
	public boolean createBTree(String gt)
	{
		Stack sck=new SequenceStack();
		root=null;
		BTreeNode p=null;
		int k=1;
		char []a=str.toCharArray();
		for(int i=0;i<a.length;i++)
		{
			switch(a[i]){
				case ‘ ‘:
				break;
				case ‘(‘:
				sck.push(p);k=1;
				break;
				case ‘)‘:
					if(sck.isEmpty()){
						System.out.println("二叉树广义表字符串错,返回假!");
						return false;
					}
					sck.pop(); break;
				case ‘,‘:
					k=2;break;
				default:
					if((a[i]>=‘a‘&&a[i]<=‘z‘)||(a[i]>=‘A‘&&a[i]<=‘Z‘)){
						p=new BTreeNode(a[i]);
						if(root==null) root=p;
						else{
							if(k==1) ((BTreeNode)sck.peek()).left=p;
							else ((BTreeNode)sck.peek()).right=p;
						}
					}
					else{
						System.out.println("二叉树广义表中存在非法字符,返回假!");
						return false;
					}
			}
		}
		if(sck.isEmpty()) return true;else return false;
	}
	public boolean isEmpty(){
		return root==null;
	}
	public void traverseBTree(String s)
	{
		if(s.equals(mode[0])) preOrder(root);
		else if(s.equals(mode[1])) inOrder(root);
		else if(s.equals(mode[2])) postOrder(root);
		else if(s.equals(mode[3])) levelOrder(root);
		System.out.println();
	}
	public Object findBTree(Object obj){
		return findBTree(root,obj);
	}
	private Object findBTree(BTreeNode rt,Object x)
	{
		if(rt==null) return null;
		else{
			if(rt.element.equals(x))
			{
				return rt.element;
			}
			else{
				Object y;
				y=findBTree(rt.left,x); if(y!=null) return y;
				y=findBTree(rt.right,x); if(y!=null) return y;
				return null;
			}
		}
	}
	public int depthBTree(){
		return depthBTree(root);
	}
	private int depthBTree(BTreeNode rt)
	{
		if(rt==null)
			return 0;
		else{
			int dep1=depthBTree(rt.left);
			int dep2=depthBTree(rt.right);
			if(dep1>dep2)
				return dep1+1;
			else
				return dep2+2;
		}
	}
	public int countBTree(){
		return countBTree(root);
	}
	private int countBTree(BTreeNode rt)
	{
		if(rt==null) return 0;
		else return countBTree(rt.left)+countBTree(rt.right);
	}
	public void printBTree(){
		printBTree(root);
		System.out.println();
	}
	private void printBTree(BTreeNode rt)
	{
		if(rt!=null){
			System.out.print(rt.element);
			if(rt.left!=null||rt.right!=null){
				System.out.print(‘(‘);
				printBTree(rt.left);
				if(rt.right!=null)
					System.out.print(‘,‘);
				printBTree(rt.right);
				System.out.print(‘)‘);
			}
		}
	}
	public void clearBTree(){root=null;}
}

客户端实现代码如下:

public class Example
{
	public static void main(String[] args)
	{
		BinaryTree nt=new LinkBinaryTree();
		String s="a(b(c),d(e(f,g),h(,i)))";
		boolean yn=bt.createBTree(s);
		if(!yn){
			System.out.println("表示二叉树的字符串s有误,退出运行!");
			System.exit(1);
		}
		System.out.println("二叉树的广义表形式:");bt.printBTree();
		System.out.println("前序:"); bt.traverseBTree("preOrder");
		System.out.println("中序:"); bt.traverseBTree("inOrder");
		System.out.println("后序:"); bt.traverseBTree("postOrder");
		System.out.println("按层:"); bt.traverseBTree("levelOrder");
		System.out.println("深度:"+bt.depthBTree());
		System.out.println("结点数:"+bt.countBTree());
		System.out.println("查找结点:"+bt.findBTree(‘g‘)+bt.findBTree(‘G‘));
		bt.clearBTree();
	}
}


普通树的存储结构和运算

普通树的接口如下:

public interface GeneralTree{
	final String []mode={"preOrder","postOrder","levelOrder"};
	boolean createBTree(String gt);
	void traverseBTree(String s);
	int degree();
	Object findGTree(Object obj);
	int depthGTree();
	int countGTree();
	void printGTree();
	boolean isEmpty();
	void clearGTree();
}

普通树的链接存储结构

结点定义:

public class GTreeNode{
	Obejct element;
	GTreeNode[] next;
	public GTreeNode(Object obj){
		element=obj;
		next=new GTreeNode[k];
		for(int i=0;i<k;i++) next[i]=null;
	}
	public GTreeNode(Object obj,GTreeNode[] nt){
		element=obj;
		next=new GTreeNode[k];
		for(int i=0;i<k;i++) next[i]=nt[i];
	}
}

树的链接存储类

public class LinkGeneralTree implements GeneralTree
{
	public class GTreeNode{
		Obejct element;
		GTreeNode[] next;
		public GTreeNode(Object obj){
			element=obj;
			next=new GTreeNode[k];
			for(int i=0;i<k;i++) next[i]=null;
		}
		public GTreeNode(Object obj,GTreeNode[] nt){
			element=obj;
			next=new GTreeNode[k];
			for(int i=0;i<k;i++) next[i]=nt[i];
		}
	}
	protected final int k;
	protected GTreeNode root;
	public LinkGeneralTree(int kk){
		k=kk;
		root=null;
	}
	public int degree() {return k;}
	private void preOrder(GTreeNode gt) {
		if(gt!=null){
			System.out.print(gt.element+" ");
			for(int i=0;i<k;i++)
				preOrder(gt.next[i]);
		}
	}
	private void postOrder(GTreeNode gt) {
		if(gt!=null){
			for(int i=0;i<k;i++)
				postOrder(gt.next[i]);
			System.out.print(gt.element+" ");
		}
	}
	private void levelOrder(GTreeNode gt) {
		Queue que=new SequenceQueue();
		GTreeNode p=null;
		que.enter(gt);
		while(!que.isEmpty()){
			p=(GTreeNode)que.leave();
			System.out.print(p.element+" ");
			for(int i=0;i<k;i++)
				if(p.next[i]!=null) que.enter(p.next[i]);
		}
	} 
	private Object findGTree(GTreeNode gt,Object x) {
		if(gt==null) return null;
		else if(gt.element.equals(x))
			return gt.element;
		else{
			Object y;
			for(int i=0;i<k;i++)
				if((y=findGTree(gt.next[i],x))!=null) return y;
			return null;
		}
	}
	private int depthGTree(GTreeNode gt) {
		if(gt==null)
			return 0;
		else{
			int max=0;
			for(int i=0;i<k;i++){
				int dep=depthGTree(gt.next[i]);
				if(dep>max) max=dep;
			}
			return max+1;
		}
	}
	private int countGTree(GTreeNode gt) {
		if(gt==null) return 0;
		else{
			int c=0;
			for(int i=0;i<k;i++) c+=countGTree(gt.next[i]);
			return c+1;
		}
	}
	private void printGTree(GTreeNode gt) {
		if(gt!=null){
			System.out.print(gt.element);
			int i,j=-1;
			for(i=0;i<k;i++)
				if(gt.next[i]!=null) j=i;
			if(j>=0){
					System.out.print(‘(‘);
					printGTree(gt.next[0]);
					for(i=1;i<=j;i++){
						System.out.print(‘,‘);
						printGTree(gt.next[i]);
					}
					System.out.print(‘)‘);
			}
		}				
	}
	public boolean createGTree(String str) {
		Stack sck=new SequenceStack();
		Stack ord=new SequenceStack();
		root=null;
		GTreeNode p=null;
		char []a=str.toCharArray();
		for(int i=0;i<a.length;i++)
		{
			switch(a[i]){
				case ‘ ‘:
				break;
				case ‘(‘:
					sck.push(p);
					ord.push(0);
					break;
				case ‘)‘:
					if(sck.isEmpty()){
						System.out.println("普通树广义表字符串错,返回假!");
						return false;
					}
					sck.pop();ord.pop();
					break;
				case ‘,‘:
					int x=(Integer)ord.pop();
					ord.push(x+1);break;
				default:
				if((a[i]>=‘a‘&&a[i]<=‘z‘)||(a[i]>=‘A‘&&a[i]<=‘Z‘))
				{
					p=new GTreeNode(a[i]);
					if(root==null) root=p;
					else{
						((GTreeNode)sck.peek()).next[(Integer)ord.peek()]=p;
					}
				}
				else{
					System.out.println("普通树广义表中存在非法字符,返回假!");
					return false;
				}
			}
		}
		if(sck.isEmpty()) return true;else return false;
	}
	public boolean isEmpty(){
		return root==null;
	}
	public void clearGTree() {root=null;}
	public void traverseGTree(String s)
	{
		if(s.equals(mode[0])) preOrder(root);
		else if(s.equals(mode[1])) postOrder(root);
		else if(s.equals(mode[2])) levelOrder(root);
		System.out.println();
	}
	public Object findGTree(Object obj){
		return findGTree(root,obj);
	}
	public int depthGTree(){
		return depthGTree(root);
	}
	public int countGTree(){
		return countGTree(root);
	}
	public void printGTree(){
		printGTree(root);
		System.out.println();
	}
}

调试普通树的客户端代码如下

public class Example{
	public static void main(String[] args){
		GeneralTree gt=new LinkGeneralTree(3);
		String s="A(B(D,E(,H,I),F),,C(,,G))";
		boolean yn=gt.createGTree(s);
		if(!yn){
			System.out.println("表示普通树的字符串s有误,退出运行!");
			System.exit(1);
		}
		System.out.print("树的广义形式:");gt.printGTree();
		System.out.println("树的度数:"+gt.degree());
		System.out.print("前序遍历:");gt.traverseGTree("preOrder");
		System.out.print("后序遍历:");gt.traverseGTree("postOrder");
		System.out.print("按层遍历:");gt.traverseGTree("levelOrder");
		System.out.println("树的深度:"+gt.depthGTree());
		System.out.println("总结点数:"+gt.countGTree());
		System.out.println("查找结点:"+(Character)gt.findGTree(‘d‘)+" "+(Character)gt.findGTree(‘H‘));
		gt.clearGTree();
	}
}


本文出自 “仙路千叠惊尘梦” 博客,请务必保留此出处http://secondscript.blog.51cto.com/9370042/1617190

数据结构之树和二叉树实现

标签:数据结构   树和二叉树   java   

原文地址:http://secondscript.blog.51cto.com/9370042/1617190

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!