按照给定的扩展二叉树前序遍历序列建立相应的非空二叉树,要求采用二叉链表进行存储,并对其进行前序遍历,输出前序遍历序列后请销毁二叉链表以释放内存。
输入格式:
第一行为一个整数n,表示以下有n组数据,每组数据占一行,为扩展二叉树的前序遍历序列。
输出格式:
在一行里输出该二叉树的前序遍历序列。
输入样例:
在这里给出一组输入。例如:
3
AB#D##C##
AB##C#D##
ABD##E##C#F##
结尾无空行
输出样例:
在这里给出相应的输出。例如:
ABDC
ABCD
ABDECF
结尾无空行
C++代码如下:
#include<iostream>
using namespace std;
typedef struct BiTNode{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
void CreatBiTree(BiTree &T){
char ch;
cin>>ch;
if(ch=='#'){
T=NULL;
}
else{
T = new BiTNode;//new BiTNode返回的是一个地址
T->data=ch;
CreatBiTree(T->lchild);
CreatBiTree(T->rchild);
}
}
void PrintTree(BiTree T){
if(T){
cout<<T->data;
PrintTree(T->lchild);
PrintTree(T->rchild);
}
}
int main(){
int n;
scanf("%d",&n);
while(n--){
BiTree T;
CreatBiTree(T);
PrintTree(T);
cout<<endl;
delete T;
}
return 0;
}
- 几个注意要点:
1)创建二叉树函数传入的参数为&T, 即void CreatBiTree(BiTree &T)
,而在遍历二叉树输出的时候则不需要&,直接传入指针T即可,即void PrintTree(BiTree T)
,也就是要修改指针的时候就要使用&取地址符,而不需要修改指针的时候就不需要&取地址符。可以具体的将指针变量T想象成一张房间卡,指针变量里面存储着变量的指针(知道指向哪个值,里面存储指针的地址),房卡里面就存储这相对应的房间的信息。那么要想修改这张房卡所能打开的房间就要修改这张房卡里面的房间信息,就要修改房间的地址,此时就要使用&,将指针的地址进行修改。而在进行二叉树的遍历的时候不需要修改指针,那么就不需要&,就相当于直接拿房卡刷对应的房间即可。在修改这个T指针,调试时你会发现T的地址发生了变化。(注意只有C++中有&,而在C中只能T,之后的程序也要一直用T)
2)new开辟的空间在堆上,而一般声明的变量存放在栈上面,new出来的是一端空间的首地址,所以一半需要用指针来存放这段地址
3)函数的递归:这里采用函数的递归创建二叉树,遍历二叉树。递归函数必须有基准条件和递归条件。
基准条件:负责达到一定条件结束循环。
递归条件:负责递归循环
如上面创建二叉树的函数,其基准条件是:if(ch=='#')
,递归条件就是ch!='#'
。比如:AB#D##,首先A!=#,令T->data=A,然后将T->lchild作为参数传入函数当中,然后继续执行,此时ch=B,满足递归条件,令T->lchild->data=B,然后将T->lchild->lchild传入函数,此时ch=#,满足了基准条件,这个时候T->lchild->lchild=NULL,然后退出,退到上一层,上一层执行到CreatBiTree(T->lchild);
,该执行CreatBiTree(T->rchild);
这一步了,此时将T->lchild->rchild传入函数,此时ch为D,则令T->lchild->rchild->data=D,此时执行CreatBiTree(T->lchild);
,ch=#所以T->lchild->rchild->lchild=NULL,然后返回上一层执行CreatBiTree(T->rchild);
,ch=#所以T->lchild->rchild->rchild=NULL。函数结束,依次返回上一层,检查每一层函数的语句是否全部执行完,最后返回到第一层函数,此时T为根节点,调用结束,退出函数
(从第6步到第7步是一层一层的返回的6->5->4->3->2->1->7)
遍历输出二叉树也是如此