java数据结构之二叉树

Posted xxniuren

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java数据结构之二叉树相关的知识,希望对你有一定的参考价值。

1、二叉树各功能模块介绍

      1.1、创建二叉树

                   二叉树数据输入是广义表输入形式:A(B(C),D(E(F,G),H(,I)))。创建该二叉树使用的是非递归方式。整个流程为:A是根元素,B、D为A的子节点,所以输入A时,把A作为根结点,遇到左括号(证明下一个有效数据输入是A的子树),此时把A压入栈中,接着来的数据是B,此时把A的数据读出来(但是此时A没有弹出栈),把B挂在A的左指针上,再次遇到左括号,此时把B也压入栈中,此时栈内有元素(B A)top指向B,然后输入C,由于C还是B的左子树,所以把B读出,然后把C挂在B上,当遇到右括号后,证明B已经没有右子树了,此时把B弹出堆栈,此时占中只有A元素,A的左子树已经构造完成。当遇到 ‘,’逗号时,表示遍历的右子树,输入D时,把A读出来,把D挂在A上,然后输入左括号,此时把D压入栈中,输入E,此时读出D,把E挂在D上,输入左括号,然后把E压入栈中,输入F,读出E,把F挂在E的左指针上,当遇到‘,’时,把结点标志设为右子树,读到G时,把G挂在E的右指针上,遇到右括号,此时弹出E,然后遇到‘,’ 把结点标志设为右子树,然后把D读出,把H挂在D上,遇到左括号,把H压入栈中,把I挂在H上,把H D A分别弹出。此时完成整个二叉树的构造。该二叉树构造需要用到堆栈,堆栈代码看我上一篇博客,在这里不做累述。二叉树结点代码如下:
package BiTreeTable;

public class BiTreeNode 
	Object element;//结点元素
	BiTreeNode left,right;//左右指针
	public BiTreeNode(Object element)//构造方法
		this.element=element;
	
	public BiTreeNode(BiTreeNode left,BiTreeNode right,Object element)
		this.left=left;
		this.right=right;
		this.element=element;
	
二叉树的创建代码如下:
	//定义广义二叉树结点       二叉树广义表A(B(C),D(E(F,G),H(,I)))
	public void creatBiTree(String gt) 
		Stack sck=new sequencetStack(); //定义和创建一个保存结点元素的栈
		root = null;
		BiTreeNode p=null;
		int k=1;
		char a[]=gt.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("二叉树广义字符串出错");
				    	  System.exit(0);//遇到右括号则出栈
				      
				      sck.pop();break;
			case ',': k=2;break;//右节点标志
			default:
				   p=new BiTreeNode(a[i]);//生成新的节点
				   if(root==null)root=p;//如果根节点为空,则把该结点作为根节点。
				   else
					   if(k==1) ((BiTreeNode)sck.peek()).left=p;//读取栈顶元素信息,然后把新节点挂在该栈顶元素上
					   else  ((BiTreeNode)sck.peek()).right=p;
				   
			
		
	

     1.2、求出二叉树中结点的个数

此处通过递归来实现,遍历左右子树,遍历到一个结点,把返回数据加一,这个用图画一下则很明朗,具体代码如下:
	//递归方式求出二叉树的结点的个数
	public int countBiTree(BiTreeNode rt) 
		if(rt==null) return 0;
		else return countBiTree(rt.left)+countBiTree(rt.right)+1;
	

     1.3、求出二叉树中结点深度

该处通过递归来实现,遍历左子树和右子树,如果左子树的深度比右子树大,则把左子树深度加一,否则把右子树深度加一。实现代码如下:
	public int deepthBiTree(BiTreeNode rt) 
		if(rt==null) return 0;
		else
			int dep1=deepthBiTree(rt.left);//递归遍历左子树
			int dep2=deepthBiTree(rt.right);//递归遍历右子树
			if(dep1>dep2) return dep1+1;   //左右子树深度比较
			else return dep2+1;
		
	

     1.4、把二叉树数据按照广义表打印输出

	public void printBiTree(BiTreeNode rt) 
		if(rt!=null)
			System.out.print(rt.element);
			if(rt.left!=null || rt.right!=null)
				System.out.print("(");//判断是否存在左子树或者是右子树
				printBiTree(rt.left);
				if(rt.right!=null) System.out.print(",");
				printBiTree(rt.right);
				System.out.print(")");
			
		
		
	

     1.5、二叉树三种遍历模式

前序遍历,首先输出数据,然后遍历左子树,再遍历右子树;中序遍历则是,首先遍历左子树,然后输出数据,再遍历右子树;后续遍历则是先遍历左子树,然后遍历右子树,再输出数据。代码相对简单,如下:
	//前序遍历
	private void preOrder(BiTreeNode rt)
		if(rt!=null)
			System.out.print(rt.element+"");
			preOrder(rt.left);
			preOrder(rt.right);
		
	
	//中序遍历
	private void inOrder(BiTreeNode rt)
		if(rt!=null)
			inOrder(rt.left);
			System.out.print(rt.element+"");
			inOrder(rt.right);
		
	
	//后序遍历
	private void postOrder(BiTreeNode rt)
		if(rt!=null)
			postOrder(rt.left);
			postOrder(rt.right);
			System.out.print(rt.element+"");
		
	
三种遍历综合起来代码如下:
	//java遍历
	public void traverseBiTree(BiTreeNode rt,BiTreeEnum s) 
		if(s.equals(BiTreeEnum.preOrder))
			preOrder(root);
		else if(s.equals(BiTreeEnum.inOrder))
			inOrder(root);
		else
			postOrder(root);
		
	

2、整个代码如下:

2.1、二叉树接口代码:

package BiTreeTable;

public interface BiTreeInterface 
	//生成二叉树
	void creatBiTree(String gt);
	//判断一个二叉树是为空
	boolean isEmpty();
	//按照给定的模式遍历二叉树
	void traverseBiTree(BiTreeNode rt,BiTreeEnum s);
	//从二叉树中查找值为obj的节点,若存在则返回完整值,否则返回空值
	Object findBiTree(BiTreeNode rt,Object obj);
	//求出一颗二叉树的深度
	int deepthBiTree(BiTreeNode rt);
	//求出一颗二叉树的结点数
    int countBiTree(BiTreeNode rt);
	//按照树的表示方法输出一颗二叉树
    void printBiTree(BiTreeNode rt);
	//清除二叉树中的所有结点,使之变为一颗空树
	void clearBiTree();

2.2、二叉树结点定义代码:

package BiTreeTable;

public class BiTreeNode 
	Object element;
	BiTreeNode left,right;
	public BiTreeNode(Object element)
		this.element=element;
	
	public BiTreeNode(BiTreeNode left,BiTreeNode right,Object element)
		this.left=left;
		this.right=right;
		this.element=element;
	

2.3、二叉树遍历枚举变量代码:

package BiTreeTable;

public enum BiTreeEnum 
	preOrder,
	inOrder,
	postOrder,
	levelOrder

2.4、二叉树实现代码:

package BiTreeTable;

import java.util.Stack;

import sequenceStack.sequencetStack;

public class BiTreeImpl implements BiTreeInterface
	
	protected BiTreeNode root;
	//初始化二叉树
	public BiTreeImpl()
		root = null;
	
	//返回二叉树的根结点
	public BiTreeNode getRoot()
		return root;
	
	//
	public void clearBiTree() 
		
	
	//递归方式求出二叉树的结点的个数
	public int countBiTree(BiTreeNode rt) 
		if(rt==null) return 0;
		else return countBiTree(rt.left)+countBiTree(rt.right)+1;
	
	//定义广义二叉树结点       二叉树广义表A(B(C),D(E(F,G),H(,I)))
	public void creatBiTree(String gt) 
		Stack sck=new sequencetStack(); //定义和创建一个保存结点指针的栈
		root = null;
		BiTreeNode p=null;
		int k=1;
		char a[]=gt.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("二叉树广义字符串出错");
				    	  System.exit(0);
				      
				      sck.pop();break;
			case ',': k=2;break;
			default:
				   p=new BiTreeNode(a[i]);
				   if(root==null)root=p;
				   else
					   if(k==1) ((BiTreeNode)sck.peek()).left=p;
					   else  ((BiTreeNode)sck.peek()).right=p;
				   
			
		
	
	//通过递归求出深度
	public int deepthBiTree(BiTreeNode rt) 
		if(rt==null) return 0;
		else
			int dep1=deepthBiTree(rt.left);
			int dep2=deepthBiTree(rt.right);
			if(dep1>dep2) return dep1+1;
			else return dep2+1;
		
	
	//找到结点元素
	public Object findBiTree(BiTreeNode rt,Object obj) 
		if(rt==null) return null;
		else
			 if(rt.element.equals(obj))
				 return rt.element;
			 else
				 Object y;
				 y=findBiTree(rt.left, obj);
				 if(y!=null) return y;
				 y=findBiTree(rt.right, obj);
				 if(y!=null) return y;
				 return null;
			 	 
		
	
	//查看该二叉树是否为空二叉树
	public boolean isEmpty() 
		return root==null;
	

	public void printBiTree(BiTreeNode rt) 
		if(rt!=null)
			System.out.print(rt.element);
			if(rt.left!=null || rt.right!=null)
				System.out.print("(");
				printBiTree(rt.left);
				if(rt.right!=null) System.out.print(",");
				printBiTree(rt.right);
				System.out.print(")");
			
		
		
	
	//前序遍历
	private void preOrder(BiTreeNode rt)
		if(rt!=null)
			System.out.print(rt.element+"");
			preOrder(rt.left);
			preOrder(rt.right);
		
	
	//中序遍历
	private void inOrder(BiTreeNode rt)
		if(rt!=null)
			inOrder(rt.left);
			System.out.print(rt.element+"");
			inOrder(rt.right);
		
	
	//后序遍历
	private void postOrder(BiTreeNode rt)
		if(rt!=null)
			postOrder(rt.left);
			postOrder(rt.right);
			System.out.print(rt.element+"");
		
	
	//java遍历
	public void traverseBiTree(BiTreeNode rt,BiTreeEnum s) 
		if(s.equals(BiTreeEnum.preOrder))
			preOrder(root);
		else if(s.equals(BiTreeEnum.inOrder))
			inOrder(root);
		else
			postOrder(root);
		
	


该工程文件我已经传到github上,上传的工程里面涵盖数据结构大部分结构:链表、线性表、堆栈、队列、二叉树、图、堆、查找、搜索。里面有详细的实现步骤,有需要可以下载。github地址:https://github.com/xxniuren/JAVA-DataStructure.git











以上是关于java数据结构之二叉树的主要内容,如果未能解决你的问题,请参考以下文章

JAVA数据结构与算法之二叉树

数据结构(java)之二叉树

数据结构之二叉树

算法之二叉树各种遍历

数据结构之二叉树

数据结构之二叉树