【例6.1】 以先根和中根次序遍历序列建立二叉树。
import ds_java.Tree1;
public class Tree1_ex //以先根、中根次序建立二叉树
{
public static void main(String args[])
{
String prestr="ABDGCEFH";
String instr="DGBAECHF";
if(args.length>1)
{
prestr=args[0];
instr=args[1];
}
Tree1 t1=new Tree1(prestr,instr);
t1.preorderTraversal();
t1.inorderTraversal();
t1.postorderTraversal();
}
}
程序运行结果如下:
prestr=ABDGCEFH instr=DGBAECHF first=A k=3
prestr=BDG instr=DGB first=B k=2
prestr=DG instr=DG first=D k=0
prestr=G instr=G first=G k=0
prestr=CEFH instr=ECHF first=C k=1
prestr=E instr=E first=E k=0
prestr=FH instr=HF first=F k=1
prestr=H instr=H first=H k=0
先根次序: A B D G C E F H
中根次序: D G B A E C H F
后根次序: G D B E H F C A
【例6.2】 以标明空子树的先根次序遍历序列建立二叉树。
程序如下:
package ds_java;
import ds_java.TreeNode1;
import ds_java.Tree1;
public class Tree2 extends Tree1 //以标明空子树的先根次序建立二叉树
{
private String str; //表示二叉树带空子树的先根遍历序列
private int i=0;
public Tree2() //构造空二叉树
{
super();
}
public Tree2(String s)
{
str=s;
System.out.println("str="+str);
if(str.length()>0)
root=enter();
}
public TreeNode1 enter() //返回所建立二叉树的根结点
{
TreeNode1 p=null;
char ch=str.charAt(i);
i++;
if(ch!='.')
{
p=new TreeNode1(ch+""); //非"."时,建立结点
p.left=enter(); //建立左子树,递归调用
p.right=enter(); //建立右子树,递归调用
}
return p; //ch="."时,返回null
}
}
源程序Tree2_ex.java调用Tree2类建立一棵二叉树。程序如下:
import ds_java.Tree2;
public class Tree2_ex //以标明空子树的先根次序建立二叉树
{
public static void main(String args[])
{
String prestr="CE..FH...";
if (args.length>0)
prestr=args[0];
Tree2 t2=new Tree2(prestr);
t2.preorderTraversal();
t2.inorderTraversal();
t2.postorderTraversal();
}
}
程序运行结果如下:
str=CE..FH...
先根次序: A B D G C E F H
中根次序: D G B A E C H F
后根次序: G D B E H F C A
【例6.3】 建立链式结构的完全二叉树。
程序如下:
import ds_java.TreeNode1;
import ds_java.Tree1;
public class Tree3 extends Tree1 //建立链式结构的完全二叉树
{
private String str;
public Tree3() //构造空二叉树
{
super();
}
public Tree3(String s) //构造完全二叉树
数据结构与算法题库 {
str=s;
System.out.println("str="+str);
root=enter(1); //以编号为1的元素作为根结点,建立一棵二叉树
}
public TreeNode1 enter(int i) //建立一棵子树,以编号为i的元素作为子树的根结点
{
TreeNode1 p=null;
char ch;
if(i<=str.length())
{
ch=str.charAt(i-1); //取字符串中第i-1个元素作为编号为i结点的元素值
System.out.println(" i="+i+" ch="+ch);
p=new TreeNode1(ch+""); //建立结点p
p.left=enter(2*i); //建立p的左子树
p.right=enter(2*i+1); //建立p的右子树
}
return p;
}
public static void main(String args[])
{
String varstr="ABCDEFGH";
if(args.length>0)
varstr=args[0];
Tree3 t3=new Tree3(varstr);
t3.preorderTraversal();
t3.inorderTraversal();
t3.postorderTraversal();
}
}
程序运行结果如下:
str=ABCDEFGH
i=1 ch=A
i=2 ch=B
i=4 ch=D
i=8 ch=H
i=5 ch=E
i=3 ch=C
i=6 ch=F
i=7 ch=G
先根次序: A B D H E C F G
中根次序: H D B E A F C G
后根次序: H D E B F G C A
【例6.4】 以广义表表示建立二叉树。
import ds_java.TreeNode1;
import ds_java.Tree2;
public class Tree4 extends Tree2 //以广义表表示建立二叉树
{
private String str;
private int i=0;
public Tree4() //构造空二叉树
{
super();
}
public Tree4(String s)
{
str=s;
System.out.println("str="+str);
if(str.length()>0)
root=enter(); //以str的全部元素建立一棵二叉树
}
public TreeNode1 enter() //以str的部分元素(从i开始)建立一棵子树
{
TreeNode1 p=null;
char ch=str.charAt(i);
if(ch>='A' && ch<='Z') //大写字母
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论