问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

c语言 c语言 二叉树构造问题

发布网友 发布时间:2022-04-25 13:58

我来回答

1个回答

热心网友 时间:2023-10-05 13:30

#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef struct BiTNode {//二叉树结点
char data;//数据
struct BiTNode *lchild,*rchild;//左右孩子指针
} BiTNode,*BiTree;
int nn=0;
int CreateBiTree(BiTree *T) {//按先序序列创建二叉树
char data;
scanf("%c",&data);//按先序次序输入二叉树中结点的值(一个字符),‘#’表示空树
if (data =='#') {
*T = NULL;
} else {
*T = (BiTree)malloc(sizeof(BiTNode)); nn++;
(*T)->data = data;   //生成根结点
CreateBiTree(&(*T)->lchild);//构造左子树
CreateBiTree(&(*T)->rchild);//构造右子树
}
return 0;
}
void Visit(BiTree T) {//输出
if (T->data!= '#') {
printf("%c ",T->data);
}
}
void PreOrder(BiTree T) {//先序遍历
if (T != NULL) {
Visit(T);//访问根节点
PreOrder(T->lchild);//访问左子结点
PreOrder(T->rchild);//访问右子结点
}
}
void InOrder(BiTree T) {//中序遍历
if (T != NULL) {
InOrder(T->lchild);//访问左子结点
Visit(T);//访问根节点
InOrder(T->rchild);//访问右子结点
}
}
void PostOrder(BiTree T) {//后序遍历
if (T != NULL) {
PostOrder(T->lchild);//访问左子结点
PostOrder(T->rchild);//访问右子结点
Visit(T);//访问根节点
}
}
void PreOrder2(BiTree T) {//先序遍历(非递归)
//访问T->data后,将T入栈,遍历左子树;遍历完左子树返回时,栈顶元素应为T,出栈,再先序遍历T的右子树。
BiTree *stack=(BiTree *)malloc(nn*sizeof(BiTree));
intsp=0;
BiTree p = T;//p是遍历指针
while (p ||sp){//栈不空或者p不空时循环
if (p != NULL) {
stack[sp]=p;sp++;//存入栈中
printf("%c ",p->data);  //访问根节点
p =p->lchild;//遍历左子树
} else {
sp--;p=stack[sp];//退栈
p =p->rchild;//访问右子树
}
}
free(stack);
}
void InOrder2(BiTree T){//中序遍历(非递归)
//T是要遍历树的根指针,中序遍历要求在遍历完左子树后,访问根,再遍历右子树。
//先将T入栈,遍历左子树;遍历完左子树返回时,栈顶元素应为T,出栈,访问T->data,再中序遍历T的右子树。
BiTree *stack=(BiTree *)malloc(nn*sizeof(BiTree));
intsp=0;
BiTree p = T;//p是遍历指针
while (p ||sp){//栈不空或者p不空时循环
if (p != NULL) {
stack[sp]=p;sp++;//存入栈中
p =p->lchild;//遍历左子树
} else {
sp--;p=stack[sp];//退栈
printf("%c ",p->data);
p =p->rchild;//访问右子树
}
}
free(stack);
}

typedefstruct BiTNodePost{
BiTree biTree;
char tag;
} BiTNodePost,*BiTreePost;
void PostOrder2(BiTree T) {//后序遍历(非递归)
BiTreePost *stack=(BiTreePost *)malloc(nn*sizeof(BiTreePost));
intsp=0;
BiTree p = T;//p是遍历指针
BiTreePost BT;
while (p !=NULL ||sp){//栈不空或者p不空时循环
while (p !=NULL) {//遍历左子树
BT = (BiTreePost)malloc(sizeof(BiTNodePost));
BT->biTree = p;
BT->tag= 'L';//访问过左子树
stack[sp]=BT;sp++; //存入栈中
p =p->lchild;
}
while (sp && (stack[sp-1])->tag== 'R') {//左右子树访问完毕访问根节点
sp--;BT=stack[sp];  //退栈
printf("%c ",BT->biTree->data);
free(BT);
}
if (sp){//遍历右子树
BT=stack[sp-1];
BT->tag= 'R';//访问过右子树
p =BT->biTree;
p =p->rchild;
}
}
free(stack);
}
void LevelOrder(BiTree T) {//层次遍历
BiTree p;
BiTree *queue;
inth=0,t=0,n=0;

if (T == NULL) return;
p=T;
queue=(BiTree *)malloc(nn*sizeof(BiTree));
queue[t]=p;t=(t+1)%10;n++;//根节点入队
while (n) {   //队列不空循环
p=queue[h];//对头元素出队
printf("%c ",p->data);  //访问p指向的结点
h=(h+1)%10;n--;//退出队列
if (p->lchild != NULL) {//左子树不空,将左子树入队
queue[t]=p->lchild;t=(t+1)%10;n++;
}
if (p->rchild != NULL) {//右子树不空,将右子树入队
queue[t]=p->rchild;t=(t+1)%10;n++;
}
}
free(queue);
}
intmain() {
BiTree T;

setlocale(LC_ALL,"chs");
CreateBiTree(&T);

printf("先序遍历        :");PreOrder  (T);printf("\n");
printf("先序遍历(非递归):");PreOrder2 (T);printf("\n");
   printf("\n");
printf("中序遍历        :");InOrder   (T);printf("\n");
printf("中序遍历(非递归):");InOrder2  (T);printf("\n");
   printf("\n");
printf("后序遍历        :");PostOrder (T);printf("\n");
printf("后序遍历(非递归):");PostOrder2(T);printf("\n");
   printf("\n");
printf("层次遍历        :");LevelOrder(T);printf("\n");

return 0;
}
//ABC##DE#G##F###
//先序遍历  :A BC DE GF
//先序遍历(非递归):A BC DE GF
//
//中序遍历  :C BE GD FA
//中序遍历(非递归):C BE GD FA
//
//后序遍历  :C GE FD BA
//后序遍历(非递归):C GE FD BA
//
//层次遍历  :A BC DE FG
//

///  A
/// /
///B
///   / \
///  C  D
/// / \
///EF
/// \
///  G

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
李卓彬工作简历 林少明工作简历 广东工业职业技术学院怎么样 郑德涛任职简历 唐新桂个人简历 土地入股的定义 ups快递客服电话24小时 贷款记录在征信保留几年? 安徽徽商城有限公司公司简介 安徽省徽商集团新能源股份有限公司基本情况 c语言二叉树代码求解 C语言二叉树 c二叉树 建立 c语言二叉树什么意思?学习要有什么基础? 数据结构c二叉树的算法 计算机c语言中什么是“二叉树”? c语言 二叉树 计算机c语言中 什么是二叉树 emotional是什么意思 什么叫emo Emotional中文怎么读 emotional好像有三种意思都是什么? emo 什么意思? Emotional是什么意思啊 emotionad中文 Emotional是什么意思? 我emotional了是什么意思 emonational中文是什么? 英语emotional什么意思 “emotional”什么意思? 关于c语言二叉树 c语言二叉树结点 C语言二叉树的应用 C语言二叉树的创建和遍历 c语言二叉树的问题 怎么查看自己在QQ防沉迷上绑定的身份证号码? 如何用专业GPU软件辨别显卡的级别 专业显卡和游戏显卡的区别? 专业显卡和普通显卡的区别 专业显卡跟普通显卡有什么区别? 专业显卡和游戏显卡究竟有什么区别 什么情况下需要用专业图形显卡? 专业显卡与普通显卡的区别 作图的显卡 专业显卡是什么意思? 西双版纳想买一顶遮阳帽子竹编的去哪里买女式尖头帽 维佩洛女士的遮阳帽如何? 夏天女性正确防晒知识,防晒要注意哪些事项 速干360度透气遮阳帽品牌brands这个品牌的女式&#14412;在哪里买到。 如何挑选遮阳伞 在爱情面前不想做灯泡做什么?