标签:创建 初始 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