二叉树的遍历 C/C++语言实现
目录
1、二叉树的定义
2、二叉树的遍历
2.1、先序遍历
递归版
非递归版
2.2、中序遍历
递归版
非递归版
2.3、后序遍历
递归版
非递归版
2.4、层序遍历
3、二叉树的创建
4、二叉树的销毁
1、二叉树的定义
二叉树包括数据域,左孩子,右孩子。如果要要方便找双亲节点还可以添加一个指针(这里没有)
typedef int TElemType;
typedef struct BitNode
{TElemType data;BitNode *lchild, *rchild;
}BitNode,*BitTree;
2、二叉树的遍历
二叉树的遍历是其他操作的基础,其他很多修改创建的操作,都是建立在二叉树的遍历的基础上的。
二叉树的遍历包括:先序遍历(图的DFS)、中序遍历、后序遍历、层序遍历(图的BFS)
后面的遍历实现都通过最简单的输出结点数据域来展示。其他操作操作都是在该基础修改来实现
下面几棵树为测试数据,可以作为参考使用:
/*
树 t1
1
/ \
2 3
/ \
4 5
/\
6 7输入:
1 2 4 -1 -1 5 6 7 -1 -1 -1 -1 3 -1 -1
先序 1 2 4 5 6 7 3
中序 4 2 6 5 7 1 3
后续 4 6 7 5 2 3 1树 t2
1
/ \
2 3
/ \
4 5
/ \
6 7
/ \
1 2输入:
1 2 4 -1 -1 5 6 1 -1 -1 2 -1 -1 7 -1 -1 3 -1 -1
先序 1 2 4 5 6 1 2 7 3
中序 4 2 1 6 2 5 7 3 1
后序 4 1 2 6 7 5 2 3 1
树 t36
/ \
3 9
/ \ / \
1 4 7 10
\ \ \ \
2 5 8 11输入:
6 3 1 -1 2 -1 -1 4 -1 5 -1 -1 9 7 -1 8 -1 -1 10 -1 11 -1 -1
先序 6 3 1 2 4 5 9 7 8 10 11
中序 1 2 3 4 5 6 7 8 9 10 11
后序 2 1 5 4 3 8 7 11 10 9 6*/
2.1、先序遍历
先序遍历访问顺序: 根结点->左孩子->右孩子。
左孩子本身可以看作另外一棵树,如果还有左右孩子,也按该顺序进行遍历。
根节点非空,打印根节点内容,递归左子树,递归右子树
递归版
void PreOrderTraverse(BitTree T)
{if (T){cout << T->data << " ";PreOrderTraverse(T->lchild);PreOrderTraverse(T->rchild);}
}
非递归版
sta栈记录工作指针。p指向当前访问结点,当前结点非空,打印该结点,将当前指着保存到栈中,进入右子树
否则到达叶子结点,回溯,弹出栈顶,进入右子树。
void RePreOrderTraverse(BitTree T)
{stack<BitNode*> sta;BitNode *p = T;BitNode *t;//临时存储弹出元素while (p || !sta.empty()){if (p){cout << p->data << " ";//输出当前节点sta.push(p);//保存当前结点p = p->lchild;//进入左子树}else//左子树遍历完成{t = sta.top();//回到上层结点sta.pop();//弹出该层p = t->rchild;//进入右子树}}}
2.2、中序遍历
中序遍历访问顺序: 左孩子->根结点->右孩子。
递归版
void InOrderTraverse(BitTree T)
{if (T){InOrderTraverse(T->lchild);cout << T->data << " ";InOrderTraverse(T->rchild);}
非递归版
void ReInOrderTraverse(BitTree T)
{stack<BitNode*> sta;BitNode *p = T;BitNode *q;while (p || !sta.empty())//当前树或栈未空{if (p){sta.push(p);//保存当前结点p = p->lchild;//进入左子树}else//左子树访问完成{q=sta.top();//获取上一层sta.pop();//弹出cout << q->data << " ";//访问根节点p = q->rchild;//进入右子树}}
}
2.3、后序遍历
后序遍历访问顺序: 左孩子->右孩子->根结点。
递归版
void PostOrderTraverse(BitTree T)
{if (T){PostOrderTraverse(T->lchild);PostOrderTraverse(T->rchild);cout << T->data << " ";}
}
非递归版
void RePostOrderTraverse(BitTree T)
{stack<BitNode*> sta;map<BitNode*,int> tag;BitNode* p = T;BitNode* t;while (p || !sta.empty()){if (p){tag[p] = 1;sta.push(p);//保存当前层p = p->lchild;//进入左子树}else//左子树遍历完成{t = sta.top();if (!t->rchild)//没有右子树,说明到达了终端{cout << t->data << " ";//打印终端sta.pop();p = t->rchild;}else {//是根节点if (tag[t] == 1)//第二次访问{tag[t] = 2;p=t->rchild;}else if(tag[t]==2){cout << t->data << " ";sta.pop();//退栈,回到上一层p = NULL;}}}}
}
2.4、层序遍历
层序遍历,即一层一层的访问二叉树,所有父节点访问后,访问其子节点,二叉树的层序遍历是通过队列实现的,所以不能通过函数递归(系统生成栈)的方式实现。
void Sequencetrav(BitTree t)
{BitNode *p;queue<BitNode*> que;que.push(t);while (!que.empty())//队列非空{p = que.front();//获取队首cout << p->data << " ";que.pop();if (p->lchild)//有左子树,入队 que.push(p->lchild);if (p->rchild)//有右子树,入队que.push(p->rchild);}
}
3、二叉树的创建
二叉树的创建,如果存在左子树或右子树为空的情况,我们需要有能够代表空的标签来填补上。
如创建int型,这里我假设全是自然数,我可以让 -1作为空的标签
void CreateBitTree(BitTree & T)
{int c;cin >> c;if (c == -1)//-1,为空结点T = nullptr;else{//否则创建结点,同时递归创建T = new BitNode;T->data = c;CreateBitTree(T->lchild);CreateBitTree(T->rchild);}
}
4、二叉树的销毁
递归,先销毁左子树,然后销毁右子树,然后销毁根节点
void DestoryTree(BitTree & t)
{if (t){DestoryTree(t->lchild);DestoryTree(t->rchild);delete[] t;t = nullptr;}
}
二叉树的增删操作都是在二叉树的遍历基础上实现,这里不在细致阐述。
二叉树的遍历 C/C++语言实现相关推荐
- 二叉树的遍历(c语言数据结构实验报告三)
二叉树的遍历 一.实验目的或任务 二.实验教学基本要求 三.实验教学的内容或要求 1. 编写函数,输入字符序列,建立二叉树的二叉链表 2. 编写函数,实现二叉树的中序递归遍历算法. 3. 编写函数,实 ...
- 二叉树层序遍历(c语言,非递归)
层序遍历的作用是将二叉树,从上到下,从左到右依次遍历.如下图遍历的结果是A->B->C->D->E->F->G->H.其实,这就相当于族谱一样,从辈分大到小遍 ...
- Algorithm:树相关算法(BBT/BST/B树/R树)简介(二叉查找树、二叉查找树的插入节点、二叉查找树的删除、二叉树的遍历、平衡二叉树)C 语言实现
Algorithm:树相关算法(BBT/BST/B树/R树)简介(二叉查找树.二叉查找树的插入节点.二叉查找树的删除.二叉树的遍历.平衡二叉树)C++语言实现 目录 树的基础知识 1.二叉树的遍-前序 ...
- C语言二叉树前序遍历(附完整源码)
C语言二叉树前序遍历 C语言二叉树前序遍历完整源码(定义,实现,main函数测试) C语言二叉树前序遍历完整源码(定义,实现,main函数测试) #include <iostream>st ...
- c语言利用遍历求树高的程序,用C语言实现二叉树的遍历极其应用
用C语言实现二叉树的遍历极其应用 [1][摘要]:<数据结构>是计算机系学生的一门专业技术基础课程,计算机科学各领域及有关的应用软件都要用到各种数据结构.C语言有较丰富的数据类型.运算符以 ...
- c语言二叉树的遍历菜单系统,C语言二叉树的三种遍历方式的实现及原理
C语言二叉树的三种遍历方式的实现及原理 发布时间:2020-10-03 19:43:57 来源:脚本之家 阅读:63 作者:看雪. 二叉树遍历分为三种:前序.中序.后序,其中序遍历最为重要.为啥叫这个 ...
- c语言二叉树的遍历菜单系统,二叉树遍历C语言的实现
广告 提供50多种云计算产品,包括云服务器和云. 创建一站式云产品试用服务,以帮助开发人员和企业以零门槛进入云环境. 上面的代码很简单,上面的图片很容易理解. 下一点是焦点: 二叉树的遍历分为前遍,中 ...
- 二叉树非递归后序遍历算法(C语言)
二叉树非递归后序遍历算法(C语言) 二叉树后序遍历的规律:左右根 后序非递归遍历中,访问根(子根)结点有两种情况 ①:遍历完左子树,需要遍历右子树,需要从栈中访问最顶上的根(子根)结点从而得到右子树的 ...
- 二叉树的深度优先搜索c语言,C语言 二叉树按层打印、深度优先遍历、二叉树是否对称...
#include//二叉树节点 typedef struct tree{ int data; struct tree *pLeft; struct tree *pRight; }Tree; //队列 ...
最新文章
- 萨默尔机器人_沣东新城王寺街道《民法典》企业宣传活动走进西安萨默尔科技...
- python装饰器原理-深刻理解python装饰器
- ntp服务器查看状态命令ntpstat及ntpq -p 说明及差别详解
- 【Codeforces 1096D】Easy Problem
- centos进程php-fpm,CentOS 6.x 开启Nginx和Php-fpm状态统计
- 在Python中最快的HTTP GET方法是什么?
- Python基础笔记(一)数据类型、变量、字符串
- ubuntu 环境变量配置
- JDK1.4下载 JRE1.4下载
- 转载:真正高人的解读——《三体 读后感》【宇宙尺度的战争】
- 算法精解 c语言 源码,算法精解七(C语言版)
- std::deque的使用
- C++ plus Primer 第六版中文版 带书签的 PDF
- 美团西安美食部分爬虫(修改版)(python)
- Mac 锁屏的各种方法
- Excel自动求和-乘法
- vue中nextTick的实际应用
- 笑话--老外与山东妞(爆笑)
- 无代码开发大众化,摆脱Excel轻松管理企业数据
- 马赛克,一生之敌,是时候说再见了【兄弟,借一部说话】
热门文章
- 获取指定存储过程的参数定义
- webmin账户重置密码
- 由System.getProperty(user.dir)引发的联想
- SocketFactory、DefaultSocketFactory、ServerSocketFactory、DefaultServerSocketFactory
- SQLite学习笔记(三)--创建内存数据库
- B/S应用中的ActiveX数字签名相关问题杂谈
- iPhone girl幕后推手浮出 制造者为论坛站长
- 软件_视频rtmp,rmvb,h265区别
- 指定jupyter运行的conda环境和报错处理generator_to_async_generator
- 都2020年了,你还认为BI=报表?