树的广度(深度)优先遍历算法
来源:互联网 发布:淘宝卖家发布宝贝流程 编辑:程序博客网 时间:2024/06/07 18:31
1 树的广度优先遍历算法
广度优先遍历算法,又叫宽度优先遍历,或横向优先遍历,是从根节点开始,沿着树的宽度遍历树的节点。如果所有节点均被访问,则算法中止。
如上图所示的二叉树,A 是第一个访问的,然后顺序是 B、C,然后再是 D、E、F、G。借助队列数据结构,由于队列是先进先出的顺序,因此可以先将左子树入队,然后再将右子树入队。
这样一来,左子树结点就存在队头,可以先被访问到。
2 树的深度优先遍历算法
深度优先遍历算法是遍历算法的一种。是沿着树的深度遍历树的节点。当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。
如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。
如上图所示的二叉树:A 是第一个访问的,然后顺序是 B、D,然后是 E。接着再是 C、F、G。
在遍历了根结点后,就开始遍历左子树,最后才是右子树。
因此可以借助堆栈的数据结构,由于堆栈是后进先出的顺序,由此可以先将右子树压栈,然后再对左子树压栈,
这样一来,左子树结点就存在了栈顶上,因此某结点的左子树能在它的右子树遍历之前被遍历。
1 #include <vector> 2 #include <iostream> 3 #include <stack> 4 #include <queue> 5 using namespace std; 6 7 struct BitNode 8 { 9 int data;10 BitNode *left, *right;11 BitNode(int x) :data(x), left(0), right(0){}12 };13 14 void Create(BitNode *&root)15 {16 int key;17 cin >> key;18 if (key == -1)19 root = NULL;20 else21 {22 root = new BitNode(key);23 Create(root->left);24 Create(root->right);25 }26 }27 28 void PreOrderTraversal(BitNode *root)29 {30 if (root)31 {32 cout << root->data << " ";33 PreOrderTraversal(root->left);34 PreOrderTraversal(root->right);35 }36 }37 38 //深度优先搜索39 //利用栈,现将右子树压栈再将左子树压栈40 void DepthFirstSearch(BitNode *root)41 {42 stack<BitNode*> nodeStack;43 nodeStack.push(root);44 while (!nodeStack.empty())45 {46 BitNode *node = nodeStack.top();47 cout << node->data << ' ';48 nodeStack.pop();49 if (node->right)50 {51 nodeStack.push(node->right);52 }53 if (node->left)54 {55 nodeStack.push(node->left);56 }57 }58 }59 60 //广度优先搜索61 void BreadthFirstSearch(BitNode *root)62 {63 queue<BitNode*> nodeQueue;64 nodeQueue.push(root);65 while (!nodeQueue.empty())66 {67 BitNode *node = nodeQueue.front();68 cout << node->data << ' ';69 nodeQueue.pop();70 if (node->left)71 {72 nodeQueue.push(node->left);73 }74 if (node->right)75 {76 nodeQueue.push(node->right);77 }78 }79 }80 81 int main()82 {83 BitNode *root = NULL;84 Create(root);85 //前序遍历86 PreOrderTraversal(root);87 //深度优先遍历88 cout << endl << "dfs" << endl;89 DepthFirstSearch(root);90 //广度优先搜索91 cout << endl << "bfs" << endl;92 BreadthFirstSearch(root);93 }
阅读全文
1 0
- 树的广度优先遍历与深度优先遍历算法
- 树的广度(深度)优先遍历算法
- 图的邻接矩阵生成算法,深度优先遍历算法,广度优先遍历算法,Prime算法。):
- 树的广度深度优先遍历算法 DFS BFS
- 图的深度优先遍历和广度优先遍历算法
- 深度优先算法、广度优先算法 与 图的遍历
- python深度优先与广度优先的遍历算法比较
- 树的广度深度优先遍历
- 图的邻接表(广度优先遍历,深度优先遍历,最小生成树(Kruskal算法))
- 算法笔记(5)图的广度优先遍历和深度优先遍历
- 图的遍历(搜索)算法(深度优先算法DFS和广度优先算法BFS)
- 图的遍历(搜索)算法(深度优先算法DFS和广度优先算法BFS)
- 图遍历算法分析--深度优先、广度优先(1)
- 深度优先和广度优先遍历算法
- 二叉树的深度优先遍历和广度优先遍历
- 普通树的深度优先遍历和广度优先遍历
- 二叉树的深度优先遍历和广度优先遍历
- 树的深度优先遍历和广度优先遍历
- levelDB的效率
- 2017/10/6模拟赛总结
- 关联规则挖掘
- UVA 107 The Cat in the Hat
- 如何通俗易懂地解释卷积?
- 树的广度(深度)优先遍历算法
- 使用jstack分析cpu消耗过高的问题
- QT(2):添加ui文件及构建ui文件的头文件说明
- 【UVA 10034 Freckles】& Kruskal & 最小生成树
- spring学习
- Python实现文件前添加序号
- poj 1066 Treasure Hunt(判断线段相交)
- 深度学习进阶(六)--CNN卷积神经网络调试,错误历程总结
- HTML开发——成长笔记(以后学习心得都会整理出来分享给大家)