6-7 在一个数组中实现两个堆栈
题目要求:
本题要求在一个数组中实现两个堆栈。
Stack CreateStack( int MaxSize );
bool Push( Stack S, ElementType X, int Tag );
ElementType Pop( Stack S, int Tag );
如果堆栈已满,Push函数必须输出“Stack Full”并且返回false;如果某堆栈是空的,则Pop函数必须输出“Stack Tag Empty”(其中Tag是该堆栈的编号),并且返回ERROR。
代码如下:
Stack CreateStack( int MaxSize ){
Stack sta=(Stack)malloc(sizeof(struct SNode));
sta->Data=malloc(sizeof(ElementType)*MaxSize);
sta->Top1=-1;//为什么是-1.
sta->Top2=MaxSize;
sta->MaxSize=MaxSize;
return sta;
}
bool Push( Stack S, ElementType X, int Tag ){
if(S->Top1+1==S->Top2){
printf("Stack Full\n");
return false;
}
if(Tag==1){
S->Data[++S->Top1]=X; //先加一后进栈,下同。
}
else{
S->Data[--S->Top2]=X;
}
return true;
}
ElementType Pop( Stack S, int Tag ){
if(S==NULL) return ERROR;
if(Tag==1){
if(S->Top1==-1){
printf("Stack %d Empty\n",Tag);
return ERROR;
}
else{
return S->Data[S->Top1--];
}
}
if(S->Top2==S->MaxSize){ //MaxSize不对。
printf("Stack %d Empty\n",Tag);
return ERROR;
}
return S->Data[S->Top2++];
}
本题思路:
1、有的答案中给出,在建栈处(int *)malloc(sizeof(ElementType)*MaxSize);
这句话为什么用(int *)给强制转换不太懂。我的代码中没有写,也能运行的通。
2、关于为什么栈1的栈顶指针在最开始时处于-1的位置,可能是因为在push操作中,是先将栈顶指针上移之后输入Data。
3、注意!这道题是数组!!看好如何存取数据。
4、第三个函数中if(S->Top2==S->MaxSize)
这句话不可以写成if(S->Top2==MaxSize)
,因为这个函数中不知道MaxSize这个变量,只有在Stack S中才有这个变量,所以必须加上S->Maxsize
5、注意输出printf中都要有"\n"来结尾,不然会有格式错误。
6-8 求二叉树高度
题目要求:
本题要求给定二叉树的高度。
int GetHeight( BinTree BT );要求函数返回给定二叉树BT的高度值。
代码如下:
int GetHeight( BinTree BT ){
if(BT==NULL) return 0;
if(BT->Left==NULL&&BT->Right==NULL){
return 1;
}
if(BT->Left==NULL){
return 1+GetHeight(BT->Right);
}
if(BT->Right==NULL){
return 1+GetHeight(BT->Left);
}
return GetHeight(BT->Right)>GetHeight(BT->Left)?1+GetHeight(BT->Right):1+GetHeight(BT->Left);
}
本题思路:
1、使用递归的思想,从最首要判断的地方开始写代码,就比如如果空树直接返回0,接着就是遇到叶子结点,普通结点到最后的根节点判断。
2、好好体会递归的思想,最后一句话判断的是根节点左右子树的高度,需要加一!
6-9 二叉树的遍历
题目要求:
本题要求给定二叉树的4种遍历。
void InorderTraversal( BinTree BT );
void PreorderTraversal( BinTree BT );
void PostorderTraversal( BinTree BT );
void LevelorderTraversal( BinTree BT );
要求4个函数分别按照访问顺序打印出结点的内容,格式为一个空格跟着一个字符。
代码如下:
void InorderTraversal( BinTree BT ){
if(BT==NULL) return;
InorderTraversal(BT->Left);
printf(" %c",BT->Data);
InorderTraversal(BT->Right);
}
void PreorderTraversal( BinTree BT ){
if(BT==NULL) return;
printf(" %c",BT->Data);
PreorderTraversal(BT->Left);
PreorderTraversal(BT->Right);
}
void PostorderTraversal( BinTree BT ){
if(BT==NULL) return;
PostorderTraversal(BT->Left);
PostorderTraversal(BT->Right);
printf(" %c",BT->Data);
}
void LevelorderTraversal( BinTree BT ){
if(BT==NULL) return;
BinTree temp;
BinTree bt[100];
int head,tail;
head=tail=0;
bt[tail++]=BT; //根节点入队。
while(head<tail){
temp=bt[head++];
printf(" %c",temp->Data);
if(temp->Left){ //存在左孩子,将其入队。
bt[tail++]=temp->Left;
}
if(temp->Right){ //存在右孩子,将其入队。
bt[tail++]=temp->Right;
}
}
}
本题思路:
1、前中后序遍历统统使用递归来实现,比较简单易懂。
2、注意输出格式,空一格加一个字符。
3、层序稍难,这里再借用队列比较麻烦,所以使用一个一位数组来模拟队列,head当做头指针,tail当做尾指针,在进入循环前应将根节点入队,只要head不等于tail则队不空,用一个temp来接收头指针的数据,分别接收temp的左右孩子,达到层序遍历的目的。