码迷,mamicode.com
首页 > 其他好文 > 详细

二叉树

时间:2018-08-15 20:36:34      阅读:161      评论:0      收藏:0      [点我收藏+]

标签:创建   初始   include   内容   结构   false   stdio.h   ini   数据   

// 二叉树```

include<stdio.h>
//#include<malloc.h>
include<stdlib.h>

define ERROR 0
define OK 1
//#define VISITED 2
define STACK_INIT_SIZE 20
define STACK_INCREMENT_SIZE 20

typedef int Status;
typedef char ElemType;
//typedef int ElemType;
//typedef struct TreeNode *Tnode;

//定义二叉树结点结构
typedef struct Tnode{
ElemType elem;//数据域
struct Tnode lchild;//左孩子
struct Tnode
rchild;//右孩子
}Tnode,*BiTree;

typedef Tnode stackElem;

//顺序栈
typedef struct{
stackElem base;
stackElem
top;
int stacksize;
}SqStack;

//初始化顺序栈
Status InitStack(SqStack S){
S->base = (stackElem
)malloc(sizeof(stackElem));//为头结点分配空间
if(!S->base){//为头结点分配空间失败
printf("初始化栈是空间分配失败!\n");
return ERROR;//返回错误
}
S->top = S->base;//初始化栈顶指针
S->stacksize = STACK_INIT_SIZE;//初始化栈的容量
return OK; //返回成功
}

//入栈
int Push(SqStack S,stackElem e){
stackElem
newbase;//栈满时需要的临时基址变量
//栈满
if(S->top - S->base >= S->stacksize){
newbase = (stackElem )malloc(sizeof(stackElem));//分配新的空间基址
if(!newbase){
printf("栈满时,分配空间失败!\n");
return ERROR;//返回错误
}
S->base = newbase;//新的基址
S->stacksize += STACK_INCREMENT_SIZE;//追加容量
}
S->top = e;//元素入栈
// printf("\n-->[%c]",S->top->elem);
S->top++;
return OK;//返回入栈成功
}

//弹栈
stackElem Pop(SqStack S){
if(S->base == S->top){//栈空
printf("栈空\n");
exit(0);
}
S->top--;
// printf("\n<--[%c]",S->top->elem);
// printf("\n[%c]-",S->top->elem);

return (S->top);

}

//判断栈空
bool IsEmpty(SqStack *S){
if(S->base == S->top){//栈空
// printf("栈空\n");
return true; //栈空为真
} else{//栈不空
return false;//栈空为假
}
}

/
函数声明
/
Status CreateTree(BiTree
root);//创建二叉树
void visit(Tnode node); //访问二叉树的结点
void PreOrderTraverse(BiTree root);//先序递归遍历二叉树 ``
void InOrderTraverse(BiTree root);//中序递归遍历二叉树
void PostOrderTraverse(BiTree root);//后序递归遍历二叉树
void InOrderTraverse1(BiTree root);//中序非递归遍历二叉树
/

主函数
/
int main(void){
BiTree root;
CreateTree(&root);//创建新的二叉树
printf("\n先序递归遍历:");
PreOrderTraverse(root);//先序遍历二叉树
printf("\n中序递归遍历:");
InOrderTraverse(root);
printf("\n后序递归遍历:");
PostOrderTraverse(root);
printf("\n中序非递归遍历:");
InOrderTraverse1(root);
/测试栈
SqStack stack;
InitStack(&stack);
for(int i = 0; i<10; i++){
Push(&stack,i+1);
}
ElemType e;
printf("\n");
for(int i = 0;i<10; i++){
printf("[%d]-", Pop(&stack));
}
/
}

// 先序创建二叉树
Status CreateTree(BiTree root){
char elem_temp = getchar();//键入数据
// getchar();
// char elem_temp = NULL;//临时定义字符
//scanf("%c",&elem_temp); //键入字符
// printf("%c",elem_temp);
if(elem_temp == ‘
‘){//作为空符
root = NULL;//指向空
} else{//接收到的不为空,赋给数据域
root = (BiTree) malloc(sizeof(Tnode));//分配空间
if(!
root){//空间分配失败
printf("创建二叉树时空间分配失败\n");
return ERROR;//返回失败标识
} else{//空间分配成功
(root)->elem = elem_temp;//赋值
CreateTree(&((
root)->lchild));//创建左子树
CreateTree(&((*root)->rchild));//创建右子树
// printf("创建成功!\n");
//return OK; //返回成功标识
}
}
}

//访问结点
void visit(Tnode *node){
// printf("\n--------------\n");
printf("%c",node->elem);//输出当前节点的元素值
}

//先序遍历二叉树,递归实现
void PreOrderTraverse(BiTree root){
if(root == NULL){//遍历到的内容是空
printf("");//输出字符
return ;//停止遍历
}else{
visit(root);//访问当前节点
// putchar(root->elem);
PreOrderTraverse(root->lchild);//访问左孩子
PreOrderTraverse(root->rchild);//访问右孩子
}
}

// 中序递归遍历二叉树
void InOrderTraverse(BiTree root){
if(root == NULL){//遍历到的内容是空
printf("");//输出字符
return ;//停止遍历
}else{
// putchar(root->elem);
InOrderTraverse(root->lchild);//访问左孩子
visit(root);//访问当前节点
InOrderTraverse(root->rchild);//访问右孩子
}
}

//后序递归遍历二叉树
void PostOrderTraverse(BiTree root){
if(root == NULL){//遍历到的内容是空
printf("");//输出字符
return ;//停止遍历
}else{
// putchar(root->elem);
PostOrderTraverse(root->lchild);//访问左孩子
PostOrderTraverse(root->rchild);//访问右孩子
visit(root);//访问当前节点
}
}

/
中序非递归遍历,实现
/
void InOrderTraverse1(BiTree root){
SqStack stack;
InitStack(&stack);
BiTree p = root;
while(p || !IsEmpty(&stack)){
if(p){
Push(&stack,
p);
p = p->lchild;
}else{
p = Pop(&stack);
visit(p);
p = p->rchild;
}
}

}

二叉树

标签:创建   初始   include   内容   结构   false   stdio.h   ini   数据   

原文地址:http://blog.51cto.com/12012875/2160419

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!