还剩3页未读,继续阅读
文本内容:
树和二叉树实验答案//默认构造方法class BTNodeEE data;BTNode Ichild;BTNode rchild;//重载构造方法public BTNode Ichild=rchild=null;public BTNodeEd data=d;Ichild=rchild=null;//二叉树类}class BTreeClass{//根结点BTNodeCharacter b;String bstr;//二叉树的括号表不串public BTreeClassb=null;//构造方法public voidCreateBTree String//二叉链中结点类//创建以为根结点的二叉链存储结构b//数据元素//建立一个栈//指向左孩子结点//指向右孩子结点//刚刚新建的结点有孩子,将其进栈while istr.length strStackBTNodest=new StackBTNode;BTNodeCharacter p=null;boolean flag=true;char ch;int i=0;ch=str.charAti;//System.out.printinv;switch ch{case1*:・st pushp;flag=true;break;case’://循环扫描中每个字符str,//栈顶结点的子树处理完,出栈case:st.pop;//开始处break;flag=false;理栈顶结点的右孩子break;default:;//用值新建一个结点ch chp=newif b==null//若尚未建立根结点通作为根结点b=p;//已建立二叉树根结点else//新结点作为栈顶结点的左孩子pif flag//新结点作为pif!st.empty st.peek.Ichild=p;}else栈顶结点的右孩子if!st.empty st.peek.rchild=p;}break;//继续遍历;i++//返回二叉链的括号表示串public StringtoString nbstr=;toStringl b;return bstr;//被方法调用DispBTNodeprivate voidtoStringl BTNodeCharactertif t!=null{bstr+=t.data;//输出根结点值if t.Ichild!=null||t.rchild!=null//有孩子结点时输出”nH nbstr+=;//递归输出左子树toStringlt.Ichild;ift.rchild!=null bstr+=,n;//有右孩子结点时输出toStringlt.rchild;//递归输出右子树bstr+=Hn;//输出实验public class7_1{public staticBTreeClass SwapBTreeClass bt{BTreeClass btl=new BTreeClass;=Swaplbtl.b bt.b;return btl;private staticBTNodeCharacter SwaplBTNodeCharacter b BTNodeCharactert,tl,t2;if b==null t=null;else{〈〉;〃复捌便统力t=new BTNodeCharacterb.data//交换左子树=Swapltl b.lchild;//交换右子树=Swaplt2b.rchi Id;t.Ichild=t2;t.rchild=tl;return t;public static void mainString[]args{String s=ABD,G,CE,FH;BTreeClassbt=new BTreeClass;・bt CreateBTrees;outSystem..printin;System.out.printInbt:+bt.toString;BTreeClass btl;n nSystem.out.printin bt-btl;=Swapbtl bt;System.out.printIn btl:+btl.toString;class Node{int data;char op;NodeIchild,rchild;//构造方法public Nodeintdata this.data=data;Ichild=rchild=null;this.op=op;Ichild=rchild=null;}实验public class7_2{//表达式二叉树根结点root;static Node//二叉树的括号表示串bstr;static Stringpublic staticvoidCreateEtString str{Node p,a,b;int i=0;char ch;//定义一个栈StackNode st=new StackNode;while istr.length{ch=str.charAti;//遇到运11T1if ch==+||ch==*-*||ch==**||ch==*/算符p=new Nodech;a=st.pop;b=st.pop;・;p.Ichild=b;p.rchild=a;st pushp;i++//其他为运算数}else intd=0;//将运算数转换为数值dwhile istr.lengthch!=*;d=d*10+ch-*0*;i++ch=str.charAti;;a=new Noded;st.push a;i++//栈顶结点为根结点root=st.peek;}bstr=DispEtl root;bstr;return//被方法调用DispETprivate staticvoid DispEtlNode tif t!=null{if t.Ichild==nullt.rchild==null//叶子结点输出bstr data+=int t.data;else//非叶子结点输出bstr op+=t.op;bstr;//有孩子结点时输出1111+=”DispEtl//递归输出左子树t.Ichild;bstrif t.rchild!=null+=,;//有右孩子结点时输出DispEtl bstr//递归输出右子树t.rchild;+=nn;//输出//求表达式树的值if t.Ichild!=null||t.rchild!=null{Complroot;returnpublic staticdouble ComplNodet{if t.Ichild==nullt.rchild==nullreturn t.data;=Compldouble at.Ichild;=Compldouble bt.rchild;11switch t.op{case-:return a-b;11case+:return a+b;case1**:return a*b;11case/:return
1.0*a/b;return0;bstr=Displnlroot,bstr;1;returnpublic staticvoid DisplnlNodet,int h{ift==null return;//叶结点bstrelse ift.Ichild==nullt.rchild==null+=t.data;else{bstr+=n;//有子表达式加一层括号if h1//处理左子树Displnlt.Ichild,h+1;//输出运算符bstr+=t.op;Displnl//处理右子树bstr+=n;//有t.rchild,h+1;if h1子表达式加一层括号publicstaticvoid mainString[]args{//后缀表达式;outnString str=107-352/*+”System..printin;后缀表达式+System.out.printin str;out创建表达式二叉树System..printinn1rootn;CreateEtstr;输出表达式二叉树”;System.out.printin2out+DispEt;System..printinn root:”计算表达式值”+Comp;System.out.printin3对应的中缀表达式”+Dispin;HSystem.out.printin4。