先序遍历来创建二叉树,#代表空树
废话不多说,直接上代码!
、
#include<Stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#define Init_Stack_size 10
#define STACKINCREMENT 10
typedef char TelemType;
typedef struct BiTNode{
TelemType data;
struct BiTNode *lchild;
struct BiTNode *rchild;
}BiTNode,*BiTree;
typedef BiTNode* SElemtype ;
typedef struct {
SElemtype *base;
SElemtype *top;
int stacksize;
}SqStack;
void InitStack(SqStack &s){
s.base = (SElemtype*)malloc(Init_Stack_size*sizeof(SElemtype));
if(!s.base) {
printf("栈初始化失败!\n");
return;
}
s.top = s.base;
s.stacksize = Init_Stack_size;
// printf("栈初始化完成!\n");
}
void push(SqStack &s,SElemtype e){
if(s.top-s.base>=s.stacksize) {
s.base = (SElemtype*)realloc(s.base,(Init_Stack_size+STACKINCREMENT)*sizeof(SElemtype));
if(!s.base) {
printf("增加内存上失败!\n");
return;
}
s.top = s.base + s.stacksize;
s.stacksize +=STACKINCREMENT;
}
*s.top = e;
s.top++;
// printf("元素%d入栈成功!\n",e);
}
void Pop(SqStack &s,SElemtype &e){//用e来存储出栈的元素
if(s.base==s.top) {
printf("栈空!\n");
return;
}
s.top--;
e = *s.top;
// printf("出栈成功!\n");
}
void GetTop(SqStack &s,SElemtype &e){
if(s.base==s.top) {
printf("栈空错误!\n");
return;
}
e = *(s.top-1);
}
int EmptyStack(SqStack &s){
if(s.base==s.top) return 1;
else return 0;
}
void CreateBiTree(BiTree &T){
TelemType ch;
scanf("%c",&ch);
if(ch=='#') {
T = NULL;
}
else {
T = (BiTree)malloc(sizeof(BiTNode));
T->data = ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
void InOrderTraverse(BiTree T){
if(T){
InOrderTraverse(T->lchild);
printf("%c ",T->data);
InOrderTraverse(T->rchild);
}
}
void PreOrderTraverse(BiTree T){
if(T){
printf("%c ",T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
int max(int a, int b){
if(a>b) return a;
else return b;
}
int Depth(BiTree T){
if(T==NULL) return 0;
return 1 + max( Depth(T->lchild) , Depth(T->rchild) );
}
int NodeCount(BiTree T){
if(T==NULL) return 0;
else return NodeCount(T->lchild) + NodeCount(T->rchild) + 1;
}
int LeafCount(BiTree T){
if(!T) return 0;
else{
if(T->lchild==NULL&&T->rchild==NULL) return 1;
else return LeafCount(T->lchild)+LeafCount(T->rchild);
}
// return count;
}
void InOrderTraverse2(BiTree T){//非递归中序遍历算法
BiTree p=T;
SqStack S;
InitStack(S);
BiTNode *q = (BiTNode*)malloc(sizeof(BiTNode));
while(p||!EmptyStack(S)){
if(p){
push(S,p);
p=p->lchild;
}
else {
Pop(S,q);
printf("%c ",q->data);
p = q->rchild;
}
}
}
int main(){
BiTree T;
printf("先序遍历创建二叉树:\n");
CreateBiTree(T);
printf("二叉树的先序遍历:\n");
PreOrderTraverse(T);
printf("\n");
printf("二叉树的中序遍历:\n");
InOrderTraverse(T);
printf("\n");
printf("二叉树的非递归中序遍历:\n");
InOrderTraverse2(T);
printf("\n");
printf("二叉树的高度为:%d\n",Depth(T));
printf("二叉树中结点的个数:%d\n",NodeCount(T));
printf("二叉树中叶子的个数:%d\n",LeafCount(T));
// ABC##DE#G##F###
// -*a##b##c##
}
用代码最后俩行注释来测试运行结果: