数据结构 - 二叉树的遍历
分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击http://www.captainbed.net
二叉树的遍历
N:访问根结点,L:遍历根结点的左子树,R:遍历根结点的右子树。
给定一棵二叉树的前序遍历序列和中序遍历序列可以惟一确定一棵二叉树。
二叉树的深度优先遍历的非递归的通用做法是采用栈,广度优先遍历的非递归的通用做法是采用队列。
深度优先遍历二叉树
1. 中序遍历(LNR)的递归算法:
若二叉树为空,则算法结束;否则:
中序遍历根结点的左子树;
访问根结点;
中序遍历根结点的右子树。
2. 前序遍历(NLR)的递归算法:
若二叉树为空,则算法结束,否则:
访问根结点;
前序遍历根结点的左子树;
前序遍历根结点的右子树。
3. 后序遍历(LRN)的递归算法:
若二叉树为空,则算法结束,否则:
后序遍历根结点的左子树;
后序遍历根结点的右子树;
访问根结点。
非递归深度优先遍历二叉树
栈是实现递归最常用的结构,利用一个栈来记下尚待遍历的结点或子树,以备以后访问,可以将递归的深度优先遍历改为非递归的算法。
1. 非递归前序遍历:遇到一个结点,就访问该结点,并把此结点推入栈中,然后下降去遍历它的左子树。遍历完它的左子树后,从栈顶托出这个结点,并按照它的右链接指示的地址再去遍历该结点的右子树结构。
2. 非递归中序遍历:遇到一个结点,就把它推入栈中,并去遍历它的左子树。遍历完左子树后,从栈顶托出这个结点并访问之,然后按照它的右链接指示的地址再去遍历该结点的右子树。
3. 非递归后序遍历:遇到一个结点,把它推入栈中,遍历它的左子树。遍历结束后,还不能马上访问处于栈顶的该结点,而是要再按照它的右链接结构指示的地址去遍历该结点的右子树。遍历完右子树后才能从栈顶托出该结点并访问之。另外,还需要给栈中的每个元素加上一个特征位,以便当从栈顶托出一个结点时区别是从栈顶元素左边回来的(则要继续遍历右子树),还是从右边回来的(则该结点的左、右子树均已遍历)。特征为Left表示已进入该结点的左子树,将从左边回来;特征为Right表示已进入该结点的右子树,将从右边回来。
非递归广度优先遍历二叉树
非递归广度优先遍历二叉树(层序遍历)是用队列来实现的。从二叉树的第一层(根结点)开始,自上至下逐层遍历;在同一层中,按照从左到右的顺序对结点逐一访问。
按照从根结点至叶结点、从左子树至右子树的次序访问二叉树的结点。算法如下:
1. 初始化一个队列,并把根结点入队列;
2. 当队列为非空时,循环执行步骤3到步骤5,否则执行6;
3. 出队列取得一个结点,访问该结点;
4. 若该结点的左子树为非空,则将该结点的左子树入队列;
5. 若该结点的右子树为非空,则将该结点的右子树入队列;
6. 结束。
/** Binary Tree Breadth-First Traverse - by Chimomo*/#include <iostream>#define _OK 1
#define _ERROR 0using namespace std;// Define node element type in binary tree.
typedef char Element;// Binary tree node.
typedef struct BTNode {Element data;BTNode *lChild, *rChild; // Define left, right subtree.
} BTNode, *BTree;// Define node element type in queue. (The node element type in queue is the pointer to binary tree node)
typedef BTNode *QElementType;
typedef int status;// We need use queue to perform level traverse. So, define queue first.
typedef struct QNode {QElementType data;QNode *next;
} QNode, *QueuePtr;// Definition of queue.
typedef struct {QueuePtr front;QueuePtr rear;
} LinkQueue;status InitQueue(LinkQueue &Q) {Q.front = NULL;Q.rear = NULL;return _OK;
}bool IsEmpty(LinkQueue Q) {return Q.front == NULL;
}/*** Enqueue.* @param Q The queue.* @param e The queue element.* @return 1 for ok, 0 for error.*/
status EnQueue(LinkQueue &Q, QElementType e) {// Construct queue node.QNode *ptrNode = (QNode *) malloc(sizeof(QNode));if (!ptrNode) {return _ERROR;}ptrNode->data = e;ptrNode->next = NULL;if (IsEmpty(Q)) {Q.front = Q.rear = ptrNode;return _OK;}Q.rear->next = ptrNode;Q.rear = ptrNode;return _OK;
}/*** Dequeue.* @param Q The queue.* @param e The queue element.* @return 1 for ok, 0 for error.*/
status DeQueue(LinkQueue &Q, QElementType &e) {if (IsEmpty(Q)) {return _ERROR;}QNode *tempPtr = Q.front;e = tempPtr->data;Q.front = tempPtr->next;free(tempPtr);return _OK;
}/*** Create binary tree.* @param T The binary tree address.* @return 1 for success, 0 for fail.*/
int CreateBTree(BTree &T) {char ch;cout << "Please input a character:" << endl;cin >> ch;if (ch == '#') {T = NULL;} else {// Allocate memory for new node.if (!(T = (BTNode *) malloc(sizeof(BTNode)))) {return 0; // Allocation fails.}T->data = ch;// Create left subtree.CreateBTree(T->lChild);// Create right subtree.CreateBTree(T->rChild);}return 1;
}void VisitBTNode(BTNode *BT) {cout << BT->data << " ";
}void VisitQNode(QNode *Q) {VisitBTNode(Q->data);
}/*** Breadth-first traverse.* @param T The binary tree.*/
void LevelTraverse(BTree T) {QElementType e;LinkQueue Q;InitQueue(Q);EnQueue(Q, T);while (!IsEmpty(Q)) {VisitQNode(Q.front);if (Q.front->data->lChild != NULL) {EnQueue(Q, Q.front->data->lChild);}if (Q.front->data->rChild != NULL) {EnQueue(Q, Q.front->data->rChild);}DeQueue(Q, e);}
}int main() {BTree T;CreateBTree(T);cout << "Breadth-first traverse: ";LevelTraverse(T);return 0;
}// Output:
/*
Please input a character:
1
1
Please input a character:
2
2
Please input a character:
3
3
Please input a character:
4
4
Please input a character:
5
5
Please input a character:
6
6
Please input a character:
#
#
Please input a character:
#
#
Please input a character:
#
#
Please input a character:
#
#
Please input a character:
#
#
Please input a character:
#
#
Please input a character:
#
#
Breadth-first traverse: 1 2 3 4 5 6
*/
数据结构 - 二叉树的遍历相关推荐
- 数据结构——二叉树的遍历
"树"是一种重要的数据结构,本文浅谈二叉树的遍历问题,採用C语言描写叙述. 一.二叉树基础 1)定义:有且仅有一个根结点,除根节点外,每一个结点仅仅有一个父结点,最多含有两个子节点 ...
- 数据结构-二叉树层次遍历
首先介绍下二叉树的层次遍历即按照顺序对树节点依次访问,如下图: 顺序遍历的结果为:ABCDEFGHIJK 我们可以借助一个队列来实现二叉树的层次遍历:思路如下: 先将二叉树根节点入队,然后出队,访问该 ...
- 数据结构-二叉树的遍历
二叉树是每个结点最多有两个子树的树结构.通常子树被称作"左子树"(left subtree)和"右子树"(right subtree).二叉树常被用于实现二叉查 ...
- java遍历树结构数据_Java数据结构——二叉树的遍历(汇总)
二叉树的遍历分为深度优先遍历(DFS)和广度优先遍历(BFS) DFS遍历主要有: 前序遍历 中序遍历 后序遍历 一.递归实现DFS Node.java: public class Node { pr ...
- 第五期 C/C++数据结构 二叉树的遍历以及结点数、深度
代码详见后面 实验三 树和二叉树 一.实验目的 1.使学生熟练掌握二叉树的逻辑结构和存储结构(重点). 2.熟练掌握二叉树的各种遍历算法(难点). 二.实验原理及说明 1. 前序遍历算法思想: (1) ...
- Java数据结构——二叉树的遍历
作者:敲代码の流川枫 博客主页:流川枫的博客 专栏:和我一起学java 语录:Stay hungry stay foolish 工欲善其事必先利其器,给大家介绍一款超牛的斩获大厂offer利器--牛客 ...
- 数据结构 二叉树的遍历
所谓遍历, 无非就是把1个容器的所有元素逐个输出, 而这个输出是线性的. 但是二叉树是1个非线性的容器, 如何把它的元素按一定顺序输出就是1个值得学习的课题了. 一般来讲, 遍历二叉树有3种方法, ...
- 02331 数据结构 二叉树的遍历
算法思想 按一定规则和顺序走遍二叉树的所有结点,使每一个节点都被访问一次,且只被访问一次. (1)先序遍历[根->左->右] 1. 访问根节点2. 遍历左孩子3. 遍历有孩子 (2)中序遍 ...
- 二叉树的遍历实验报告C语言,数据结构-二叉树的遍历(类C语言描写叙述)
遍历概念 所谓遍历(Traversal)是指沿着某条搜索路线.依次对树中每一个结点均做一次且仅做一次訪问.訪问结点所做的操作依赖于详细的应用问题. 遍历是二叉树上最重要的运算之中的一个,是二叉树上进行 ...
最新文章
- java web学习项目20套源码完整版
- tf.reshape 和 tf.transpose 用法
- Python pass 语句
- C++编程经验总结1
- Asp.net输出Excel文件并且下载该文件以及某些细节问题解决
- 如何彻底关闭FF新推荐弹出广告
- 啦啦外卖41.8[四端全开源版本]
- Scripting for Testers 测试人员脚本编程教程 Lynda课程中文字幕
- 解决windows server2012 评估版本过期,系统自动关机 重启
- Java原生图片Base64转码与Base64解码
- Linux 管道通信
- 首页banner广告图片轮换超炫效果代码
- 2022-03-03 北京 计算机知识。字符编码,ppt
- QQ邮箱导出的通讯录出现乱码怎么办?
- java.jpi在线_JPI中常使用的类介绍:
- php redis 操作
- 除霾神器:中科爱讯推出BHU智能新风机,让你呼吸森林空气
- 我市12个海滨浴场提升改造沙滩今夏不硌脚
- 12小时制(AM PM)字符串转换为24时制
- Walk Through the Fire,Is there a way out