java实现二叉树的建立及遍历方法
来源:互联网 发布:英国大学排名知乎 编辑:程序博客网 时间:2024/06/05 14:42
写一个树的结点类:
public class TreeNode {
private Object value;//结点取值
private TreeNode lChild;//结点的左子树
private TreeNode rChild;//结点的右子树
public Object getValue() {
return value;
}
public void setValue(Object value) {
this.value = value;
}
public TreeNode getLChild() {
return lChild;
}
public void setLChild(TreeNode child) {
lChild = child;
}
public TreeNode getRChild() {
return rChild;
}
public void setRChild(TreeNode child) {
rChild = child;
}
}
构建二叉树及遍历方法的类如下:
public class MakeTree {
/**
* 构造二叉树的方法
*
*/
public TreeNode makeTree(char[] str){//str是传进来的表示二叉树的表达式的char数组 表达式为括号表示法
TreeNode[] stack=new TreeNode[str.length];//用一个数组来做栈
int top=-1;
int k=0,j=0;//k=1表示是左孩子,k=2表示是右孩子
char ch=str[j];//对数组中的值进行判断
TreeNode b=null;
TreeNode p=null;
while((Character)ch!=null){//char是基本数据类型,char属于基本类型,不是类,只有类才能置成null,基本类型的初始化值只能是0
switch (ch) {
case '(':top++;stack[top]=p;k=1;break;//表示是左子数
case ',':k=2;break;//表示是右子树
case ')':top--;break;//
default: p=new TreeNode();
p.setValue(ch);
p.setLChild(null);
p.setRChild(null);
if(b==null){//p为根节点
b=p;
}else{
switch (k) {
case 1:stack[top].setLChild(p);break;//
case 2:stack[top].setRChild(p);break;//
}
}
}
if(j<str.length-1){
ch=str[++j];
}else{
break;
}
}
return b;
}
/**
* 递归先序遍历
*/
public void preOrder(TreeNode root){
if(root!=null){
System.out.print(root.getValue()+" ");//先序遍历是先遍历根结点再遍历左子树最后遍历右子树 所以先输出根结点
preOrder(root.getLChild());
preOrder(root.getRChild());
}
}
/**
* 非递归实现先序遍历
*/
public void preOrder1(TreeNode root){
TreeNode[] tn=new TreeNode[50];//将数组假设为栈,即使数组有栈的特性,只在一端进行操作,并且先进后出
TreeNode p=null;
int top=-1;
if(root!=null){
top++;
tn[top]=root;
while(top>-1){
p=tn[top];
top--;
System.out.print(p.getValue()+" ");
if(p.getRChild()!=null){//先序遍历是先遍历根结点再遍历左子树最后遍历右子树 所以这里先把右子树入栈
top++;
tn[top]=p.getRChild();
}
if(p.getLChild()!=null){
top++;
tn[top]=p.getLChild();
}
}
}
}
/**
* 中序递归遍历二叉树
*/
public void inOrder(TreeNode root){
if(root!=null){
inOrder(root.getLChild());
System.out.print(root.getValue()+" ");//先序遍历是先遍历左子树再遍历根结点最后遍历右子树 所以先输出左子树结点
inOrder(root.getRChild());
}
}
/**
* 中序非递归遍历二叉树
*/
public void inOrder1(TreeNode root){
TreeNode[] tn=new TreeNode[50];
TreeNode p=null;
int top=-1;
if(root!=null){
p=root;
while(top>-1||p!=null){
while(p!=null){//扫描p的所有左结点并进栈
top++;
tn[top]=p;
p=p.getLChild();
}
if(top>-1){
p=tn[top];//出栈p结点
top--;
System.out.print(p.getValue()+" ");//访问
p=p.getRChild();//扫描p结点的所有右孩子
}
}
}
}
/**
* 后序递归遍历
*
*/
public void postOrder(TreeNode root){
if(root!=null){
postOrder(root.getLChild());
postOrder(root.getRChild());
System.out.print(root.getValue()+" ");
}
}
/**
* 后序非递归遍历
*/
public void postOrder1(TreeNode root){
TreeNode[] tn=new TreeNode[50];
TreeNode p=null;
int top=-1;
int flag=0;
if(root!=null){
do{
while(root!=null){
top++;
tn[top]=root;
root=root.getLChild();
}
p=null;
flag=1;
while(top!=-1&&flag==1){
root=tn[top];
if(root.getRChild()==p){
System.out.print(root.getValue()+" ");
top--;
p=root;
}else{
root=root.getRChild();
flag=0;
}
}
}while(top!=-1);
}
}
/**
* @主函数
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
MakeTree makeTree=new MakeTree();
String str="A(B(D(,G)),C(E,F))";
char[] ch=str.toCharArray();
TreeNode treeNode=makeTree.makeTree(ch);
System.out.println("二叉树先序递归遍历结果:");
makeTree.preOrder(treeNode);
System.out.println();
System.out.println("二叉树先序非递归遍历结果:");
makeTree.preOrder1(treeNode);
System.out.println();
System.out.println("二叉树中序递归遍历结果:");
makeTree.inOrder(treeNode);
System.out.println();
System.out.println("二叉树中序非递归遍历结果:");
makeTree.inOrder1(treeNode);
System.out.println();
System.out.println("二叉树后序递归遍历结果:");
makeTree.postOrder(treeNode);
System.out.println();
System.out.println("二叉树后序非递归遍历结果:");
makeTree.postOrder1(treeNode);
System.out.println();
}
}
- java实现二叉树的建立及遍历方法
- 二叉树的建立及遍历实现
- 二叉树的遍历及实现方法
- 数据结构 二叉树的建立及三种遍历方法
- 二叉树的建立删除及三种遍历实现
- C++实现 二叉树的建立及4种遍历
- 递归实现二叉树的建立及前中后序遍历 c
- 二叉树的建立删除及三种遍历实现
- 简单二叉树的建立及遍历 Java版
- java实现二叉树的建立以及前序中序后序遍历
- 数据结构--java实现二叉树的先序、中序、后序、层次遍历及根据先序中序建立二叉树
- 二叉树的建立及层次遍历及前中后序遍历递归与非递归的实现
- 二叉树 的建立及遍历 过程
- 二叉树的建立及递归遍历
- 二叉树的建立及遍历
- 线索二叉树的建立及遍历
- 二叉树的建立,及相关遍历
- 二叉树的建立及递归遍历
- 杭电1012结题报告
- (转载)Linux管道命令
- IOS学习五:UITabBarController初步
- 8.5字段操作
- C语言资料大全
- java实现二叉树的建立及遍历方法
- C语言学习之模块化编程
- 左值与右值
- 互联网产品用户体验设计的三大定律
- 备份 文件 到 disk (继续上次的试验) (二)
- (转载)ubuntu 10.10 安装配置LAMP
- NDK版本与Android固件要求对应表
- 如何在网页中实现音乐播放功能
- 数学之美系列一:统计语言模型