树——通用树的层次遍历

1,为何及如何按层次遍历通用树中的每一个数据元素?

1,通用树结构是一种容器类型的树结构,其用来装数据元素,所以应该提供一种方法来遍历树中的每一个数据结构;

2,往下分析;

2,当前的事实:

1,树是非线性的数据结构,树的结点没有固定的编号方式;

1,也就不能像链表一样统一编号来访问;

3,新的需求:

1,为通用树结构提供新的方法,快速遍历每一个结点;

4,设计思路(游标):

1,在树中定义一个游标(GTreeNode<T>*);

2,遍历开始前将游标指向根结点(root());

3,获取游标指向的数据元素;

4,通过结点中的 child 成员移动游标;

5,提供一组遍历相关的函数,按层次访问树中的数据元素;

5,层次便利算法:

1,原料:class LinkQueue<T>;

2,游标:LinkQueue<T>::front();

3,思想:

1,begin() ==> 将根结点压入队列中;

2,current() ==> 访问队头元素指向的数据元素;

3,next() ==> 队头元素弹出,将队头元素的孩子压入队列中(核心);

4,end() ==> 判断队列是否为空;

6,层次遍历算法示例:

7,层次遍历算法代码实现:

 1     bool begin()  // 为树中结点的遍历做初始化
 2     {
 3         bool ret = (root() != NULL);  // 不能遍历空树
 4
 5         if( ret )
 6         {
 7             m_queue.clear();  // 防止上一次没有调用完,这一次又调用,先清除;保证只有根结点;
 8             m_queue.add(root());  // 添加根结点;
 9         }
10
11         return ret;
12     }
13
14     bool end()  // 队列长度为 0 则树遍历结束
15     {
16         return (m_queue.length() == 0);
17     }
18
19     bool next()  // 队头元素弹出来,队头元素的孩子压入队列,同时指针一直指向下一个结点
20     {
21         bool ret = (m_queue.length() > 0);  // 有元素才能移动游标
22
23         if( ret )
24         {
25             GTreeNode<T>* node = m_queue.front();  // 将 node 指向对头元素
26             m_queue.remove();  // 队头元素拿出来,就指向了下一个结点
27
28             for(node->child.move(0); !node->child.end(); node->child.next())  // 出队列的结点(被 node 指向)的孩子压入队列
29             {
30                 m_queue.add(node->child.current());
31             }
32         }
33
34         return ret;
35     }
36
37     T current()  // 返回当前游标所指向的结点的元素
38     {
39         if( !end() )  // 遍历结束,不指向目标
40         {
41             return m_queue.front()->value;  // 将游标指向结点元素返回, front() 函数已经指向了当前的对象
42         }
43         else
44         {
45             THROW_EXCEPTION(InvalidOperationException, "No value at current position ..."); // 还没开始或者结束的非法操作
46         }
47   }

8,小结:

1,树的结点没有固定的编号方式;

2,可以按照层次关系对树中的结点进行遍历;

3,通过游标的思想设计遍历成员函数;

4,遍历成员函数是互相依赖,相互配合的关系;

5,遍历算法的核心为队列的使用;

原文地址:https://www.cnblogs.com/dishengAndziyu/p/10925362.html

时间: 2024-10-09 04:47:46

树——通用树的层次遍历的相关文章

数据结构:树的BFS,树的层次遍历! 按先序遍历创建一棵树,然后以层次遍历输出。

按先序遍历创建一棵树,以层次遍历输出 样例输入 A B # D # # C E # # F # # 样例输出 LevelOrder: A B C D E F 代码: #include <iostream> #include <queue> using namespace std; struct node { //表示一个树上的节点 char ch; node *left, *right; }; node* creat() { //以递归的方式构造一棵二叉树 node *root =

树——通用树结点的清除

1,树是一种数据结构,用来存储容器,因此它可以用来看做一种容器类型:既可以向容器中插入东西,也可以将容器中的东西倒出来: 2,清除操作的定义: 1,void clear(): 1,将树中的所有结点清除(释放堆中的结点): 3,树中数据元素的清除: 1,递归清除: 4,清除操作功能的定义: 1,free(node) 1,清除 node 为根结点的树: 2,释放树中的每一个结点: 2,功能函数代码实现: 1 /* 清除 node 树的根结点 */ 2 void free(GTreeNode<T>*

树——通用树到二叉树的转换

1,已经创建了通用树结构,有必要创建另一种树结构吗? 2,简化树就直接减少结点中孩子的数量,但是这样树还能通用吗? 3,通用树结构的回顾: 1,双亲孩子表示法: 1,每个结点都有一个指向双亲的指针: 2,每个结点都有若干个指向其孩子的指针: 4,另一种树结构模型: 1,孩子兄弟表示法: 1,每个结点都有一个指向其第一个孩子的指针: 2,每个结点都有一个指向其第一个右兄弟的指针: 1,孩子兄弟表示法可以描述普通的树型结构,因为通过根结点可以访问到这一个树形结构的每一个结点: 5,孩子兄弟表示法的特

树——通用树的存储结构与结点实现

1,上篇博文介绍了树的定义和相关概念定义,本节课创建树对象和树结点对象: 2,课程目标: 1,完成树和结点的存储结构设计: 1,没有树结点,就没有树,同生死: 3,设计要点: 1,GTree 为通用树结构,每个结点可以存在多个后继结点: 2,GTreeNode 能够包含任意多指向后继结点的指针: 3,实现树结构的所有操作(增,删,查,等): 1,抽象类只用包含功能函数,具体的对象才包含成员变量和实现功能函数: 4,GTreeNode 的设计与实现: 1,组合单链表类,因为要包含任意多指向结点的指

树——二叉树的层次遍历

1,二叉树的遍历: 1,二叉树的遍历(Traversing Binary Tree)是指从根结点出发,按照某种次序依次访问二叉树中的所有结点,使得每个结点被访问一次,且仅被访问一次: 1,层次就是访问的次序,层次遍历是先访问第一层.再第二层等: 2,考虑的问题: 1,通用树结构的层次遍历算法是否可以用在二叉树结构上?如果可以,代码需要做怎样的改动? 1,可以的,二叉树是一种特别的树: 2,通用树使用的算法可以移植到二叉树使用的场合: 3,设计思路(游标): 1,提供一组遍历相关的函数,按层次访问

数据结构开发(24):二叉树中属性操作、层次遍历与典型遍历

0.目录 1.二叉树中属性操作的实现 2.二叉树结构的层次遍历 3.二叉树的典型遍历方式 4.小结 1.二叉树中属性操作的实现 二叉树的属性操作: 二叉树中结点的数目: 定义功能:count(node) 在 node 为根结点的二叉树中统计结点数目 在BTree.h中实现统计结点数目: protected: int count(BTreeNode<T>* node) const { int ret = 0; if( node != NULL ) { ret = count(node->l

(树)每一层节点的右指针问题(层次遍历)

题目:https://www.nowcoder.com/practice/fdbd05d647084fcf9be78444e231998b?tpId=46&tqId=29064&tPage=1&rp=1&ru=/ta/leetcode&qru=/ta/leetcode/question-ranking 题目翻译: 给定一个二叉树 struct TreeLinkNode { TreeLinkNode * left; TreeLinkNode * right; Tree

二叉树 的先序 中序、后序遍历、层次遍历以及树状打印等操作

#include <stdio.h> #include <stdlib.h> #define MAXSIZE 50 typedef struct Node { char data; struct Node *LChild; struct Node *RChild; }BiTNode,*BiTree; typedef struct { BiTree element[MAXSIZE]; int front; int rear; }SeqQueue; /*初始化队列*/ void Ini

树的层次遍历(Java代码实现)

与树的前中后序遍历的DFS思想不同,层次遍历用到的是BFS思想.一般DFS用递归去实现(也可以用栈实现),BFS需要用队列去实现. 层次遍历的步骤是: 1.对于不为空的结点,先把该结点加入到队列中 2.从队中拿出结点,如果该结点的左右结点不为空,就分别把左右结点加入到队列中 3.重复以上操作直到队列为空 1 public class Solution{ 2 class TreeNode { 3 int val; 4 TreeNode left; 5 TreeNode right; 6 TreeN