尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
二叉树的遍历 线索二叉树
二叉树的存储结构--链式存储二叉树的遍历-前序遍历两个 return两种退出函数的方式手写return;仅当TNULL空节点触发直接结束当前这一次函数调用。隐式自动 return重点你疑惑的点当节点不为 NULL函数中所有代码全部执行完毕走到函数最后的大括号}C 语言 void 函数会自动返回上一层调用处不需要写 return 关键字。❗每一次函数调用都有自己独立的局部变量 T。下层函数的 T不会修改上层函数的 T。示例执行 preOrder (H) 的完整流程THH 不为 NULL跳过 if打印 H。执行preOrder(H-lchild)左孩子为空触发手写return;回到 H 函数左递归语句结束。执行preOrder(H-rchild)节点 KTK不为 NULL打印 KK 左为空手写 return回到 K 函数K 右为空手写 return回到 K 函数K 内部全部代码跑完遇到}隐式自动 return回到 H 函数。H 函数printf、左递归、右递归全部执行完成。走到}隐式自动 return回到 D 函数中调用 H 的那一行。#include stdio.h typedef char ElemType; tyedef struct TreeNoed { ElemType data; struct TreeNode *lchild; struct TreeNode *rchild; }TreeNode; typedef TreeNode* BigTree;//指针的指针 char str[]ABDH#K###E##CFI###G#J##; //传入节点从左到右 int idex0; void createTree(BigTree *T)//BeTree是一级指针BeTree*是二级指针也就是传的参数是二级指针 { //通过递归的方式造树 ElemType ch; chstr[idx]; if(ch#) { *TNULL; } else { *T(BiTree)malloc(sizeof(TreeNode)); //赋值 创建节点 (*T)-datach; createTree((*T)-lchild); createTree((*T)-rchild); } } void inOrder(BiTree T) { if(TNULL) { return; } printf(%c ,T-data); preOrder(T-lchild); preOder(T-rchild); } int main() { BiTree T; createTree(T); preOrder(T); printf(\n); return 0; }中序遍历#include stdio.h typedef char ElemType; tyedef struct TreeNoed { ElemType data; struct TreeNode *lchild; struct TreeNode *rchild; }TreeNode; typedef TreeNode* BigTree;//指针的指针 char str[]ABDH#K###E##CFI###G#J##; //传入节点从左到右 int idex0; void createTree(BigTree *T)//BeTree是一级指针BeTree*是二级指针也就是传的参数是二级指针 { //通过递归的方式造树 ElemType ch; chstr[idx]; if(ch#) { *TNULL; } else { *T(BiTree)malloc(sizeof(TreeNode)); //赋值 创建节点 (*T)-datach; createTree((*T)-lchild); createTree((*T)-rchild); } } void inOrder(BiTree T) { if(TNULL) { return; } preOrder(T-lchild); printf(%c ,T-data); preOder(T-rchild); } int main() { BiTree T; createTree(T); preOrder(T); printf(\n); return 0; }后序遍历#include stdio.h typedef char ElemType; tyedef struct TreeNoed { ElemType data; struct TreeNode *lchild; struct TreeNode *rchild; }TreeNode; typedef TreeNode* BigTree;//指针的指针 char str[]ABDH#K###E##CFI###G#J##; //传入节点从左到右 int idex0; void createTree(BigTree *T)//BeTree是一级指针BeTree*是二级指针也就是传的参数是二级指针 { //通过递归的方式造树 ElemType ch; chstr[idx]; if(ch#) { *TNULL; } else { *T(BiTree)malloc(sizeof(TreeNode)); //赋值 创建节点 (*T)-datach; createTree((*T)-lchild); createTree((*T)-rchild); } } void inOrder(BiTree T) { if(TNULL) { return; } preOrder(T-lchild); preOder(T-rchild); printf(%c ,T-data); } int main() { BiTree T; createTree(T); preOrder(T); printf(\n); return 0; }非递归前序遍历二叉树性质线索二叉树存储结构#include stdio.h #include stdlib.h typedef cahr ElemType; //定义线索二叉树的节点结构 typedef struct ThreadNode{ ElemType data; struct ThreadNode *lchild; struct ThreadNode *rchild; int ltag; //左标志0表示左孩子1表示前驱线索 int rtag; // 右标志0表示有右孩子1表示后驱线索 }ThreadNode; typedef ThreadNode* ThreadTree; char str[]ABDH##I##EJ###CF##G##; int idx0; ThreadTree prev; //创建普通二叉树 void createTree(ThreadTree *T){ ElemType chstr[idx]; if(ch#){ *TNULL;//空节点 }else{ *T(TreadTree)malloc(sizeof(ThreadNode)); (*T)-datach; createTree((*T)-lchild); //构建左子树0为有左子树1为有线索 (*T)-ltag(*T)-lchild ? 0:1; createTree(*(T)-rchild); (*T)-rtag(*T)rchild ? 0:1; } //中序线索化函数建立前驱/后驱关系 void threading(ThreadTree T){ if(T!NULL){ threading(T-lchild); //递归线索化左子树 // 如果当前节点左指针为空建立前驱线索 if(T-ltag1) T-lchildprev; //如果前一个节点的右指针为空建立其后继线索指向当前节点 if(prevprev-tag1) prev-rchildT; prevT; //更新 prev为当前节点 threading(T-child); //线索化递归右子树 } } //创建头节点调用线索化过程建立线索二叉树 void inOderThreading (Threading *T,ThreadTree *head) { *head(ThreadTree)malloc(sizeof(ThreadNode)); (*head)-ltag0; (*head)-rtag1; (*head)-rchild*head; //初始时回指向自己 if(*TNULL){ (*head)-lchild*head; //空树的情况 }else{ (*head)-lchild*T; //头节点左指向根节点 prev*head; //初始化前驱指针 保存着上一个访问的节点 threading(*T); //中序线索化整个树 //补全最后一个节点的后继线索 prev-rchild*head; //prev-rtag1; (*head)-rchildprev; } } //中序线索遍历线索化后的二叉树非递归 void inOder(ThreadTree T){ ThreadTree currT-lchild; //从头节点的左子树开始 while(curr!T){ //沿左孩子一直走到底 while(curr-ltag0) currcurr-lchild; //直至找不到 输出 printf(%c,curr-data); //顺着线索一直向右访问所有后继 while(curr-rtag1curr-rchild!T){ currcurr-rchild; printf(%c,curr-data); } //进入当前节点的右子树 currcurr-rchild; } } int main(){ ThreadTree T,head; //head 为头节点 createTree(T); //创建原始二叉树 inOderhreaing(T,head); //执行线索化处理 printf(中序遍历结果:); inOder(head); retrn 0; //遍历线索二叉树 }
RELATED

相关推荐

5个Grok Bot实战配置:代码审查、API生成、数据库迁移、日志分析与Git提交优化

5个Grok Bot实战配置:代码审查、API生成、数据库迁移、日志分析与Git提交优化

如果你是一名开发者,最近一定在朋友圈或技术社区看到过 Cursor 和 Grok Bot 这两个名字。它们被描述为“AI 编程的革命性工具”,能“自动生成代码”、“理解上下文”、“重构项目”。但当你真正打开 Cursor,面对 Grok Bot 的界面时&#xff0…

📅 2026/10/5 15:46:36
##关于Java中继承的部分知识点##

##关于Java中继承的部分知识点##

一、继承1.1. 继承关系表示类之间的继承关系,需要借助 extends 关键字。示例:修饰符 class 子类 extends 父类 {// ... }1.2 成员变量访问当子类和父类有相同成员变量时,在子类中引用时,优先访问子类自己的成员变量。1.3 方法重写…

📅 2026/9/26 5:20:20
从2021美赛O奖论文看数学建模核心能力:问题拆解、特征工程与系统思维

从2021美赛O奖论文看数学建模核心能力:问题拆解、特征工程与系统思维

1. 引言:为什么今天还要看三年前的O奖论文?最近在整理资料,翻到了2021年美赛(MCM/ICM)的几篇O奖论文。说实话,刚看到标题时,我第一反应是:都过去三年了,这些“老古董”还…

📅 2026/10/11 7:57:11
MORE NEWS

更多资讯

📰

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

📰

综合之自动售货机2.0

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

AHT10读取温湿度

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

ws2812动态滚动显示图片

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

MIPI协议介绍

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

【后端】ORM / ODM

待更新

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬