二叉树先序遍历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语言实现相关推荐

  1. C++实现二叉树 前、中、后序遍历(递归与非递归)非递归实现过程最简洁版本

    本文并非我所写,是复制的该链接中的内容: 最近学习二叉树,想编程实现递归和非递归的实现方式: 递归的方式就不说了,因为大家的递归程序都一样:但是对于非递归的实现方式, 根据这几天的查阅资料已看到差不多 ...

  2. 二叉树遍历方法——前、中、后序遍历(图解)

    目录 一.前序遍历 (1)递归版本 (2)非递归版本 二.中序遍历 (1)递归版本 (2)非递归版本 三.后序遍历 (1)递归版本 (2)非递归版本 四.总结 五.测试程序 六.程序输出 二叉树的遍历 ...

  3. 图解二叉树非递归版的中序遍历算法

    你会学到什么 讨论的问题是什么 这个问题相关的概念和理论 非递归版中序遍历算法 代码思考 算法技巧 实现代码 快照 评价算法 总结 欢迎关注算法思考与应用公众号 你会学到什么? 树的递归遍历算法很容易 ...

  4. 【LeetCode | 二叉树前、中、后序遍历{迭代法}实现】

    1.前序遍历 // 解题思路:利用栈的原理实现以迭代方法来前序遍历(根左右)二叉树 class Solution { public:vector<int> preorderTraversa ...

  5. 已知二叉树前序遍历是ADCEFGHB,中序遍历是CDFEGHAB,要求画出二叉树的结构或写出后序遍历

    笔试特别喜欢考这种题.先说一下思路. 首先,需要明白前序.中序.后序遍历: ①前序:根→左→右 ②中序:左→根→右 ③后序:左→右→根 仅明白这个是不行的,还需要技巧.对于标题中的问题, 我们很容易根 ...

  6. 剑指offer 07重建二叉树(根据前序、中序遍历)草真tm难

    /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode ...

  7. 二叉树的层序遍历,前序遍历(递归,非递归),中序遍历(递归,非递归),后续遍历(递归,非递归)

    文章目录 二叉树的层序遍历 前序遍历 递归版本 非递归版本 中序遍历 递归版本 非递归版本 后序遍历 递归版本 非递归版本 二叉树的层序遍历 void printTree(BinaryTree* ar ...

  8. c语言程序第一章编程,c语言程序的设计第一章 C语言编程入门.ppt

    c语言程序的设计第一章 C语言编程入门 第1章 C语言编程入门 本章是本书的入门篇,专为初学者熟悉编程过程.掌握程序结构而准备的. 本章学习目标 ? 1)? 能够通过模仿与改变来构造带有测试函数的C语 ...

  9. 统计字符 c语言程序,统计字符个数的C语言程序.doc

    统计字符个数的C语言程序.doc 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览.不比对内容而直接下载带来的问题本站不予受理. 2.下载的文档,不会出现我们的网址水印. 3.该文 ...

  10. 理解——先序遍历是入栈过程,中序遍历是出栈过程

    遇到这样一道题:先序序列为a,b,c,d的不同二叉树的个数是多少? 拿到这个问题 首先,要了解到先序遍历和中序遍历都是需要用到栈,其中,先序遍历是入栈过程,中序遍历是出栈过程 然后,二叉树的先序序列和 ...

最新文章

  1. 2022-2028年中国医学模拟教育产品市场供需现状及投资战略研究报告
  2. 方德系统装exe文件_CAXA CAD与国产操作系统全面适配
  3. delphi 多个线程 多个进度条_多线程有哪些优点?- Python每日3题(多线程专题)
  4. 给3月要跳槽的前端提个醒!不了解微前端就别去面试了,不然……
  5. apache php隐藏头信息的方法,apache、php隐藏http头部版本信息的实现方法
  6. java eden区_(转)可能是把Java内存区域讲的最清楚的一篇文章
  7. 一个问题引发的连环血案
  8. Linux的文件权限与目录配置
  9. 实体框架 Code First 迁移命令
  10. Linux下视频流媒体直播服务器搭建详解
  11. LOJ#6070. 「2017 山东一轮集训 Day4」基因 解题报告
  12. 京东、腾讯历经最难Q1
  13. VMware16的安装及VMware配置Linux虚拟机(详解版)
  14. 基于MATLAB的求解线性方程组(附完整代码和例题)
  15. @zxing/library实现平板手机扫码功能(二维码+条形码)
  16. 向量的加减(输出重载)
  17. R语言-批量读取数据文件以及提取字符串中的数字
  18. Leetcode-数据结构-118. 杨辉三角
  19. STM32学习之:RAM的分配和占用
  20. 网络面试题:字节序?网络字节序和主机字节序?

热门文章

  1. zypper in 安装下载不了_HANA安装过程
  2. 无刷电机转子位子检测——电感法
  3. 人生就是一场猝不及防
  4. 灵动微电子MM32L0130系列MCU具有出色的低功耗表现
  5. VS2017修改默认包含目录、库目录
  6. 全志a64linux内核编译,全志A64 lichee编译脚本build.sh分析
  7. 计算机关机什么中的信息全部丢失,断电之后,信息全部丢失的是( )。A.RAMB.ROMC.软盘D.硬盘 - 作业在线问答...
  8. Python爬虫——第一个小爬虫(经典)修改版
  9. c语言同或与异或,同或、异或、位移、按位与、按位或运算
  10. 《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务