首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
SAAS
ToB门户
了解全球最新的ToB事件
论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
微博
Follow
记录
Doing
博客
Blog
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
排行榜
Ranklist
相册
Album
应用中心
qidao123.com ToB IT社区-企服评测·应用市场
»
论坛
›
软件与程序人生
›
DevOps与敏捷开发
›
《数据布局(C语言版)第二版》第五章-树和二叉树(5.4- ...
返回列表
发新帖
《数据布局(C语言版)第二版》第五章-树和二叉树(5.4-5.5.1)
[复制链接]
发表于 2026-2-14 08:03:27
|
显示全部楼层
|
阅读模式
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要
登录
才可以下载或查看,没有账号?
立即注册
×
5.4 二叉树的性子和
存储
布局
5.5 遍历二叉树和线索二叉树
5.5.1 遍历二叉树
先序、中序、后序遍历的递归算法
//算法5.1 先序、中序、后序遍历的递归算法
#include <stdio.h>
#include <stdlib.h>
typedef char TElemType;
typedef struct BiTNode
{
TElemType data;
struct BiTNode* lchild;
struct BiTNode* rchild;
}BiTNode, * BiTree;
void InitBiTree(BiTree& T);
void CreateBiTree(BiTree& T);
void preOrderTraverse(BiTree& T);
void InOrderTraverse(BiTree& T);
void posOrderTraverse(BiTree& T);
//ABC##DE#G##F###
int main()
{
BiTree Tree = NULL;
InitBiTree(Tree);
printf("请输入要用二叉链表表示的字符序列: ");
CreateBiTree(Tree);
printf("\n二叉链表的先序序列为: ");
preOrderTraverse(Tree);
printf("\n二叉链表的中序序列为: ");
InOrderTraverse(Tree);
printf("\n二叉链表的后序序列为: ");
posOrderTraverse(Tree);
return 0;
}
//初始化二叉树
void InitBiTree(BiTree& T)
{
T = NULL;
}
//按先序次序输入二叉树中结点的值(一个字符),创建二叉链表表示的二叉树T
//由于先序遍历的顺序是“根节点-左子树-右子树”,因此仅有先序可以正确创建二叉树,当根结点为空时,令其整个二叉树为空,而不用管左右子树
void CreateBiTree(BiTree& T)
{
TElemType ch = '\0';
ch = getchar();
/* getchar从键盘获取且只能获取一个字符。
接收空格和制表符(空格或制表符会被算作一个正常字符读入一次),
不接收回车,遇到回车即认为本次输入结束。
但末尾输入的回车会被留在缓存流中,在下一次被getchar读取到(吃掉回车),并将该回车作为本次输入的结束。
*/
//scanf_s(" %c", &ch); //用scanf_s会将整个字符序列写进ch中,无法进行递归创建二叉树
/*scanf_s在输入的末尾遇到空白符(空格符、回车符(\n)和制表符(\t)等) 时,都会认为本次输入结束。
对于参数%d:会忽略缓冲区开头的空白符(空格、回车、制表符等)(无论有几个),只从数字开始读取。
但对输入末尾的非数字字符,包括空白符,则可能进入无限循环程序,使得无法进行下一次输入;
对于参数%c:会直接读取缓冲区的第一个字符(无论这个字符是什么)。
所以一般需要在%c前面加一个空格,利用格式化的输入方式,使得遇到空格的scanf_s认为本次输入已结束,
直接等待下一次输入,而放弃缓冲区内的所有字符,来跳过上一次输入末尾的换行符。
*/
if (ch == '#')
{
T = NULL;
}
else
{
T = (BiTree)malloc(sizeof(BiTNode));
T->data = ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
//先序遍历二叉树
void preOrderTraverse(BiTree& T)
{
if (T) //只有当T不为空时才访问它的成员
{
printf(" %c", T->data);
preOrderTraverse(T->lchild);
preOrderTraverse(T->rchild);
}
}
//中序遍历二叉树
void InOrderTraverse(BiTree& T)
{
if (T)
{
InOrderTraverse(T->lchild);
printf(" %c", T->data);
InOrderTraverse(T->rchild);
}
}
//后序遍历二叉树
void posOrderTraverse(BiTree& T)
{
if (T)
{
posOrderTraverse(T->lchild);
posOrderTraverse(T->rchild);
printf(" %c", T->data);
}
}
复制
代码
先序、中序、后序遍历的非递归算法
//先序、中序、后序遍历二叉树的非递归算法
#include <stdio.h>
#include <stdlib.h>
typedef char TElemType;
typedef struct BiTNode
{
TElemType data;
struct BiTNode* lchild;
struct BiTNode* rchild;
}BiTNode, * BiTree;
//链栈的数据结构
typedef struct StackNode
{
BiTree TNodeptr;
struct StackNode* next;
}StackNode, * LinkStack;
void InitStack(LinkStack& S);
void Push(LinkStack& S, BiTree p);
BiTree Pop(LinkStack& S);
BiTree GetTop(LinkStack& S);
int EmptyStack(LinkStack& S);
void InitBiTree(BiTree& T);
void CreateBiTree(BiTree& T);
void preOrderTraverse(BiTree& T);
void InOrderTraverse(BiTree& T);
void posOrderTraverse(BiTree& T);
/* 按先序次序输入二叉树中结点的值:(输入的结尾一定是两个#号)
ABC##DE#G##F###
-*a##b##c##
ABD##E##C## */
int main()
{
BiTree Tree = NULL;
InitBiTree(Tree);
char choice = '\0';
while (1)
{
printf("请输入要用二叉链表表示的字符先序序列: ");
CreateBiTree(Tree);
printf("\n二叉链表的先序序列为: ");
preOrderTraverse(Tree);
printf("\n二叉链表的中序序列为: ");
InOrderTraverse(Tree);
printf("\n二叉链表的后序序列为: ");
posOrderTraverse(Tree);
printf("\n是否继续?(y/n):");
scanf_s(" %c", &choice);
getchar();
if (choice != 'y' && choice != 'Y')
{
break;
}
printf("\n\n");
}
return 0;
}
//初始化栈
void InitStack(LinkStack& S)
{
S = NULL;
}
//元素进栈
void Push(LinkStack& S, BiTree p)
{
struct StackNode* r = NULL;
r = (struct StackNode*)malloc(sizeof(struct StackNode));
if (!r)
{
printf("创建新结点时,内存分配失败。");
return;
}
r->TNodeptr = p;
r->next = S;
S = r;
}
//栈顶元素出栈
BiTree Pop(LinkStack& S)
{
if (!S)
{
printf("弹出栈顶元素时,栈不存在。");
return NULL;
}
struct StackNode* r = S;
BiTree a = S->TNodeptr;
S = S->next;
free(r);
return a;
}
//获取栈顶元素
BiTree GetTop(LinkStack& S)
{
if (!S)
{
printf("获取栈顶元素时,栈不存在。");
return NULL;
}
return S->TNodeptr;
}
//判断栈是否为空
int EmptyStack(LinkStack& S)
{
if (!S)
{
return 1;
}
else
{
return 0;
}
}
//初始化二叉树
void InitBiTree(BiTree& T)
{
T = NULL;
}
//按先序次序输入二叉树中结点的值(一个字符),创建二叉链表表示的二叉树T
void CreateBiTree(BiTree& T)
{
TElemType ch = '\0';
ch = getchar();
if (ch == '#')
{
T = NULL;
}
else
{
T = (BiTree)malloc(sizeof(BiTNode));
T->data = ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
复制
代码
回复
使用道具
举报
返回列表
浏览过的版块
物联网
分布式数据库
SAAS
Oracle
Java
前端开发
梦见你的名字
+ 我要发帖
登录后关闭弹窗
登录参与点评抽奖 加入IT实名职场社区
去登录
微信订阅号
微信服务号
微信客服(加群)
H5
小程序
快速回复
返回顶部
返回列表