C/C++知识点之二叉树
小标 2019-04-01 来源 : 阅读 1197 评论 0

摘要:本文主要向大家介绍了C/C++知识点之二叉树,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

本文主要向大家介绍了C/C++知识点之二叉树,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

C/C++知识点之二叉树

// 二叉树```


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;
}
}


}

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言C/C+频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程