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数据结构之二叉树的主要内容,如果未能解决你的问题,请参考以下文章