以下仅含作业题所用到的函数,其它函数自行寻找答案(书上的三种遍历代码是正确的)
bitre BiTree::create_pre_bitre(bitre T) //读入后构造二叉树,调用方式this.create_pre_bitre(root),this指对象名,下同 { char ch; cin>>ch; if (ch=='.') T=NULL; else { T=new bnode; T->data=ch; T->lchild=create_pre_bitre(T->lchild); T->rchild=create_pre_bitre(T->rchild); } return T; } void BiTree::dis(bitre T) //析构函数的组成函数 { if(T!=NULL) { dis(T->lchild); dis(T->rchild); delete T; } } bitre BiTree::change_child(bitre T) //交换左右孩子指针的值 { if (T!=NULL) { bitre temp; temp=T->rchild; T->rchild=T->lchild; T->lchild=temp; T->lchild=change_child(T->lchild); T->rchild=change_child(T->rchild); } return T; }
以下两个函数不是二叉树类函数,需要用到友元函数(自己翻书)
bitre exch(bitre T,char A[],int n) //从数组形式转换到链表二叉树 { if (n<=num && A[n-1]!='.') { T=new bnode; T->data=A[n-1]; T->lchild=exch(T->lchild,A,2*n); T->rchild=exch(T->rchild,A,2*n+1); } else T=NULL; return T; } bitre copy_bitre(bitre T1,bitre T2) //拷贝二叉树 { if (T1==NULL) return NULL; else { T2=new bnode; T2->data=T1->data; T2->lchild=copy_bitre(T1->lchild,T2->lchild); T2->rchild=copy_bitre(T1->rchild,T2->rchild); return T2; } } typedef struct node { char data; struct node *lchild, *rchild; } bnode,*bitre; //bnode为树节点,bitre为指向树结点的指针
构造类 class BiTree 含有私有成员bitre root 解释:以下部分函数类型为二叉树结点指针型,这就是与书上代码的最大区别。经测试,按照书上用void作为函数类型,运行时会出错,调试发现指针所指的结点的各个值不会因为函数发生变化。百度后发现,必须使用指针类型函数,即函数return指针值放可实现。
并没有给出完整程序,希望各位自行完成。