先根遍历二叉树c语言程序,二叉树先序遍历C语言实现
二叉树先序遍历C语言实现
二叉树先序遍历的实现思想是:
访问根节点;
访问当前节点的左子树;
若当前节点无左子树,则访问当前节点的右子树;
以图 1 为例,采用先序遍历的思想遍历该二叉树的过程为:
访问该二叉树的根节点,找到 1;
访问节点 1 的左子树,找到节点 2;
访问节点 2 的左子树,找到节点 4;
由于访问节点 4 左子树失败,且也没有右子树,因此以节点 4 为根节点的子树遍历完成。但节点 2 还没有遍历其右子树,因此现在开始遍历,即访问节点 5;
由于节点 5 无左右子树,因此节点 5 遍历完成,并且由此以节点 2 为根节点的子树也遍历完成。现在回到节点 1 ,并开始遍历该节点的右子树,即访问节点 3;
访问节点 3 左子树,找到节点 6;
由于节点 6 无左右子树,因此节点 6 遍历完成,回到节点 3 并遍历其右子树,找到节点 7;
节点 7 无左右子树,因此以节点 3 为根节点的子树遍历完成,同时回归节点 1。由于节点 1 的左右子树全部遍历完成,因此整个二叉树遍历完成;
因此,图 1 中二叉树采用先序遍历得到的序列为:
1 2 4 5 3 6 7
代码实现
char emptyData = '#'; /* 当一个节点没有左右孩子的时候,输出emptyData的值 */
// 树的结构体定义
typedef char TElemType;
typedef struct BiTNode
{
TElemType data;
struct BiTNode *lchild;
struct BiTNode *rchild;
}BiTNode,*BiTree;
递归
void PreOrderTraverse(BiTree T)
{
if (T == NULL)
{
printf("#");
return;
}
printf("%c",T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
非递归(链栈)
栈定义
// 栈
typedef int SElemType;
typedef struct StackNode
{
BiTree TreeNode;
struct StackNode *next;
}StackNode,*LinkStackPtr;
typedef struct LinkStack
{
LinkStackPtr top;
int count;
}LinkStack;
栈方法
// 栈
/* 构造一个空栈S */
void InitStack(LinkStack *S)
{
S->top = (LinkStackPtr)malloc(sizeof(StackNode));
S->top = NULL;
S->count = 0;
}
/* 进栈 */
void Push(LinkStack *S,BiTNode **q)
{
LinkStackPtr p;
p = (LinkStackPtr)malloc(sizeof(StackNode));
p->TreeNode = *q;
p->next = S->top;
S->top = p;
S->count++;
}
/* 出栈 */
void Pull(LinkStack *S,BiTNode **q)
{
LinkStackPtr p;
if (S->top)
{
*q = S->top->TreeNode;
p = S->top;
S->top = S->top->next;
S->count--;
free(p);
}
}
/* 返回S的元素个数,即栈的长度 */
int StackLength(LinkStack S)
{
return S.count;
}
非递归函数
void PreOrderTraverseBak1(BiTree T,LinkStack *S)
{
BiTNode *p=T,*q;
// 表示空结点
q->data = emptyData;
q->lchild = NULL;
q->rchild = NULL;
Push(S,&p);
while(S->count != 0)
{
Pull(S,&p);
printf("%c",p->data);
if(p->rchild)
{
Push(S,&(p->rchild));
}
else if (p->data != emptyData)
{
Push(S,&q);
}
if(p->lchild)
{
Push(S,&(p->lchild));
}
else if (p->data != emptyData)
{
Push(S,&q);
}
}
printf("\n");
}
思想:使用栈,首先将头节点首先入栈 ,保证栈中开始至少有一个元素。使用一个while循环,只要栈还非空就一直进行。循环体中首先获取栈顶节点,将其打印后直接出栈,并将其的右孩子和左孩子依次入栈(如果存在的话)。根据栈的FILO特性,最后入栈的左孩子将在下一轮中成为栈顶元素。这样就能满足前序遍历的特点。
第二种非递归函数
void PreOrderTraverseBak2(BiTree T,LinkStack *S)
{
BiTNode *p=T;
while(S->count != 0 || p)
{
while(p)
{
printf("%c",p->data);
Push(S,&p);
p = p->lchild;
}
printf("%c",emptyData);
Pull(S,&p);
p = p->rchild;
}
printf("%c",emptyData);
}
思想:循环开始,从栈顶节点(除第一次是根节点)开始不断左探,入栈并打印,直到左孩子为空;然后指针指向栈顶元素的右孩子,开启下一轮循环。
先根遍历二叉树c语言程序,二叉树先序遍历C语言实现相关推荐
- C++实现二叉树 前、中、后序遍历(递归与非递归)非递归实现过程最简洁版本
本文并非我所写,是复制的该链接中的内容: 最近学习二叉树,想编程实现递归和非递归的实现方式: 递归的方式就不说了,因为大家的递归程序都一样:但是对于非递归的实现方式, 根据这几天的查阅资料已看到差不多 ...
- 二叉树遍历方法——前、中、后序遍历(图解)
目录 一.前序遍历 (1)递归版本 (2)非递归版本 二.中序遍历 (1)递归版本 (2)非递归版本 三.后序遍历 (1)递归版本 (2)非递归版本 四.总结 五.测试程序 六.程序输出 二叉树的遍历 ...
- 图解二叉树非递归版的中序遍历算法
你会学到什么 讨论的问题是什么 这个问题相关的概念和理论 非递归版中序遍历算法 代码思考 算法技巧 实现代码 快照 评价算法 总结 欢迎关注算法思考与应用公众号 你会学到什么? 树的递归遍历算法很容易 ...
- 【LeetCode | 二叉树前、中、后序遍历{迭代法}实现】
1.前序遍历 // 解题思路:利用栈的原理实现以迭代方法来前序遍历(根左右)二叉树 class Solution { public:vector<int> preorderTraversa ...
- 已知二叉树前序遍历是ADCEFGHB,中序遍历是CDFEGHAB,要求画出二叉树的结构或写出后序遍历
笔试特别喜欢考这种题.先说一下思路. 首先,需要明白前序.中序.后序遍历: ①前序:根→左→右 ②中序:左→根→右 ③后序:左→右→根 仅明白这个是不行的,还需要技巧.对于标题中的问题, 我们很容易根 ...
- 剑指offer 07重建二叉树(根据前序、中序遍历)草真tm难
/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode ...
- 二叉树的层序遍历,前序遍历(递归,非递归),中序遍历(递归,非递归),后续遍历(递归,非递归)
文章目录 二叉树的层序遍历 前序遍历 递归版本 非递归版本 中序遍历 递归版本 非递归版本 后序遍历 递归版本 非递归版本 二叉树的层序遍历 void printTree(BinaryTree* ar ...
- c语言程序第一章编程,c语言程序的设计第一章 C语言编程入门.ppt
c语言程序的设计第一章 C语言编程入门 第1章 C语言编程入门 本章是本书的入门篇,专为初学者熟悉编程过程.掌握程序结构而准备的. 本章学习目标 ? 1)? 能够通过模仿与改变来构造带有测试函数的C语 ...
- 统计字符 c语言程序,统计字符个数的C语言程序.doc
统计字符个数的C语言程序.doc 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览.不比对内容而直接下载带来的问题本站不予受理. 2.下载的文档,不会出现我们的网址水印. 3.该文 ...
- 理解——先序遍历是入栈过程,中序遍历是出栈过程
遇到这样一道题:先序序列为a,b,c,d的不同二叉树的个数是多少? 拿到这个问题 首先,要了解到先序遍历和中序遍历都是需要用到栈,其中,先序遍历是入栈过程,中序遍历是出栈过程 然后,二叉树的先序序列和 ...
最新文章
- 2022-2028年中国医学模拟教育产品市场供需现状及投资战略研究报告
- 方德系统装exe文件_CAXA CAD与国产操作系统全面适配
- delphi 多个线程 多个进度条_多线程有哪些优点?- Python每日3题(多线程专题)
- 给3月要跳槽的前端提个醒!不了解微前端就别去面试了,不然……
- apache php隐藏头信息的方法,apache、php隐藏http头部版本信息的实现方法
- java eden区_(转)可能是把Java内存区域讲的最清楚的一篇文章
- 一个问题引发的连环血案
- Linux的文件权限与目录配置
- 实体框架 Code First 迁移命令
- Linux下视频流媒体直播服务器搭建详解
- LOJ#6070. 「2017 山东一轮集训 Day4」基因 解题报告
- 京东、腾讯历经最难Q1
- VMware16的安装及VMware配置Linux虚拟机(详解版)
- 基于MATLAB的求解线性方程组(附完整代码和例题)
- @zxing/library实现平板手机扫码功能(二维码+条形码)
- 向量的加减(输出重载)
- R语言-批量读取数据文件以及提取字符串中的数字
- Leetcode-数据结构-118. 杨辉三角
- STM32学习之:RAM的分配和占用
- 网络面试题:字节序?网络字节序和主机字节序?
热门文章
- zypper in 安装下载不了_HANA安装过程
- 无刷电机转子位子检测——电感法
- 人生就是一场猝不及防
- 灵动微电子MM32L0130系列MCU具有出色的低功耗表现
- VS2017修改默认包含目录、库目录
- 全志a64linux内核编译,全志A64 lichee编译脚本build.sh分析
- 计算机关机什么中的信息全部丢失,断电之后,信息全部丢失的是( )。A.RAMB.ROMC.软盘D.硬盘 - 作业在线问答...
- Python爬虫——第一个小爬虫(经典)修改版
- c语言同或与异或,同或、异或、位移、按位与、按位或运算
- 《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务