题目:设计并验证如下算法:按后序序列建立二叉树的二叉链表结构,求其单分支结点数目,双分支结点数目,并交换该二叉树。
后序序列建立二叉树需要借助栈,栈的定义如下stack.h
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#define TRUE 1
#define FALSE 0
#define ERROR 0
#define OK 1
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef int Status;
typedef struct {
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
Status InitStack(SqStack *);
Status DestroyStack(SqStack *);
Status StackEmpty(SqStack);
SElemType GetTop(SqStack );
Status Push(SqStack *,SElemType );
SElemType Pop(SqStack *);
Status InitStack(SqStack *S) {
S->base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));
S->top = S->base;
S->stacksize = STACK_INIT_SIZE;
return OK;
}
Status DestroyStack(SqStack *S) {
if(S->base)
free(S->base);
S->top = S->base = NULL;
return OK;
}
Status StackEmpty(SqStack S) {
if(S.top == S.base)
return TRUE;
else
return FALSE;
}
SElemType GetTop(SqStack S) {
SElemType e;
if(S.top == S.base)
return ERROR;
e = *(S.top-1);
return e;
}
Status Push(SqStack *S,SElemType e) {
if(S->top - S->base >= S->stacksize) {
S->base = (SElemType *)realloc(S->base, (S->stacksize + STACKINCREMENT) * sizeof(SElemType));
S->top = S->base + S->stacksize;
S->stacksize += STACKINCREMENT;
}
*S->top++ = e;
return OK;
}
SElemType Pop(SqStack *S) {
SElemType e;
if(S->top == S->base)
return ERROR;
e = *(--S->top);
return e;
}
程序代码如下:
/*
*FileName :PostCreatTree
*CopyRight :Dengguang
*/
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<string.h>
#define OK 1
#define ERROR 0
typedef int Status;
typedef char TElemType;
typedef struct BiTNode {
TElemType data;
struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;
typedef char SElemType;
#include"stack.h"
SqStack S;
Status InitBiTree(BiTree *);
BiTree PreCreateBiTree(BiTree *); //先序扩展序列递归建树
BiTree PostCreateBiTree(BiTree *); //后序扩展序列建树准备工作
BiTree PostCreateBiTree2(BiTree *); //后序扩展序列递归建树
Status PreOrder(BiTree );
Status InOrder(BiTree );
Status PostOrder(BiTree );
Status Exchange(BiTree ); //交换该树
int SingleNodesNumber(BiTree ); //单分支结点
int DoubleNodesNumber(BiTree ); //双分支结点
int main() {
BiTree BT;
TElemType ch;
int flag = 1, select = 0;
InitStack(&S);
InitBiTree(&BT);
printf("\t*\tPlease select: *\n");
printf("\t*\t1.PreOrder Create with '#' *\n");
printf("\t*\t2.PostOrder Create with '#' *\n");
while(1) {
scanf("%d", &select);
printf(" Please input:");
if(select == 1) {
BT = PreCreateBiTree(&BT);break;
}
else if(select == 2) {
BT = PostCreateBiTree(&BT);break;
}
}
printf("Create BiTree successfully!\n\n");
while(flag) {
printf("\t*\tPlease select: *\n");
printf("\t*\t1.PreOrder Traversal *\n");
printf("\t*\t2.InOrder Traversal *\n");
printf("\t*\t3.PostOrder Traversal *\n");
printf("\t*\t4.Single Nodes Number *\n");
printf("\t*\t5.Double Nodes Number *\n");
printf("\t*\t6.Exchange the left and right nodes *\n");
printf("\t*\t7.Exit *\n");
scanf("%d", &select);
switch(select) {
case 1:printf("\n The PreOrder Traversal of Binary Tree is: ");
PreOrder(BT); break;
case 2:printf("\n The InOrder Traversal of Binary Tree is: ");
InOrder(BT); break;
case 3:printf("\n The PostOrder Traversal of Binary Tree is: ");
PostOrder(BT); break;
case 4:printf("\n The Number of Single Nodes is %d", SingleNodesNumber(BT));
break;
case 5:printf("\n The Number of Double Nodes is %d", DoubleNodesNumber(BT));
break;
case 6:Exchange(BT);printf("\n Exchange over!");
break;
default:flag = 0;
printf("Press any key to exit!\n");
getch();
}
printf("\n");
}
return 0;
}
Status InitBiTree(BiTree *BT) {
*BT = NULL;
}
//先序扩展序列递归建树
BiTree PreCreateBiTree(BiTree *BT) {
TElemType ch;
scanf("%c", &ch);
if(ch == '#') {
*BT = NULL;
return *BT;
}
else {
*BT = (BiTNode *)malloc(sizeof(BiTNode));
(*BT)->data = ch;
(*BT)->lchild = PreCreateBiTree(&((*BT)->lchild));
(*BT)->rchild = PreCreateBiTree(&((*BT)->rchild));
}
return *BT;
}
//后序扩展序列建树准备工作,接收字符入栈
BiTree PostCreateBiTree(BiTree *BT) {
TElemType ch;
scanf("%c", &ch);
Push(&S, ch);
while(1) {
scanf("%c", &ch);
if(ch == '\n')
break;
Push(&S, ch);
}
*BT = PostCreateBiTree2(&(*BT));
return *BT;
}
//后序扩展序列递归建树
BiTree PostCreateBiTree2(BiTree *BT) {
TElemType ch;
ch = Pop(&S);
if(ch == '#') {
*BT = NULL;
return *BT;
}
else {
*BT = (BiTNode *)malloc(sizeof(BiTNode));
(*BT)->data = ch;
(*BT)->rchild = PostCreateBiTree2(&((*BT)->rchild));
(*BT)->lchild = PostCreateBiTree2(&((*BT)->lchild));
}
return *BT;
}
Status PreOrder(BiTree BT) {
if(BT) {
if(!(BT->data))
return ERROR;
printf("%c ", BT->data);
PreOrder(BT->lchild);
PreOrder(BT->rchild);
return OK;
}
}
Status InOrder(BiTree BT) {
if(BT) {
if(!(BT->data))
return ERROR;
InOrder(BT->lchild);
printf("%c ", BT->data);
InOrder(BT->rchild);
return OK;
}
}
Status PostOrder(BiTree BT) {
if(BT) {
if(!(BT->data))
return ERROR;
PostOrder(BT->lchild);
PostOrder(BT->rchild);
printf("%c ", BT->data);
return OK;
}
}
//交换该树
Status Exchange(BiTree BT) {
if(BT) {
BiTree temp;
temp = BT->lchild;
BT->lchild = BT->rchild;
BT->rchild = temp;
Exchange(BT->lchild);
Exchange(BT->rchild);
}
}
//单分支结点
int SingleNodesNumber(BiTree BT) {
if(!BT)
return 0;
else {
int s1=0, s2=0;
s1 = SingleNodesNumber(BT->lchild);
s2 = SingleNodesNumber(BT->rchild);
if((BT->lchild && !BT->rchild) || (BT->rchild && !BT->lchild)) {
printf("%c\t", BT->data);
return s1 + s2 + 1;
}
else
return s1 + s2;
}
}
//双分支结点
int DoubleNodesNumber(BiTree BT) {
if(!BT)
return 0;
else {
int n = 0;
if(BT->lchild && BT->rchild)
n = 1;
int d1 = DoubleNodesNumber(BT->lchild);
int d2 = DoubleNodesNumber(BT->rchild);
if(n == 1) {
printf("%c\t", BT->data);
return d1 + d2 + 1;
}
else
return d1 + d2;
}
}
测试结果:
* Please select: *
* 1.PreOrder Create with '#' *
* 2.PostOrder Create with '#' *
2
Please input:###12###3##4567##89
Create BiTree successfully!
* Please select: *
* 1.PreOrder Traversal *
* 2.InOrder Traversal *
* 3.PostOrder Traversal *
* 4.Single Nodes Number *
* 5.Double Nodes Number *
* 6.Exchange the left and right nodes *
* 7.Exit *
1
The PreOrder Traversal of Binary Tree is: 9 7 2 1 6 5 3 4 8
2
The InOrder Traversal of Binary Tree is: 2 1 7 6 3 5 4 9 8
3
The PostOrder Traversal of Binary Tree is: 1 2 3 4 5 6 7 8 9
4
2 6
The Number of Single Nodes is 2
5
5 7 9
The Number of Double Nodes is 3