图的深搜与广搜

复习下二叉树、图的深搜与广搜。

从图的遍历说起。图的遍历方法有两种:深度优先遍历(Depth First Search), 广度优先遍历(Breadth First Search),其经典应用走迷宫、N皇后、二叉树遍历等。遍历即按某种顺序訪问“图”中全部的节点,顺序分为:

  • 深度优先(优先往深处走),用的数据结构是栈, 主要是递归实现。
  • 广度优先(优先走近期的)。用的数据结构是队列。主要是迭代实现。

对于深搜。因为递归往往能够方便的利用系统栈,不须要自己维护栈。所以通常实现比較简单。

而对于广搜。则须要自己维护一个队列,且因为队列大小未知,底层存储的物理结构採用链式存储。

二叉树概念和性质

二叉树是每个节点最多有两个子树的树结构,常被用于实现二叉查找树和二叉堆。

在图论中,二叉树定义是一个连通的无环图。而且每个顶点的度不大于2。二叉树和树有非常多类似之处,但并非树的特殊情形,主要有下面三点主要区别:

  1. 树中结点的最大度数没有限制,而二叉树结点的最大度数为2。
  2. 树的结点无左、右之分,而二叉树的结点有左、右之分;
  3. 树的结点个数至少为1,而二叉树的结点个数能够为0

树的一些相关概念:

  • 结点的度:结点所拥有的子树的个数称为该结点的度。二叉树就仅仅有 0,1。2 三种情况;
  • 叶结点:度为 0 的结点称为叶结点,或者称为终端结点;
  • 分枝结点:度不为 0 的结点称为分支结点,一棵树的结点除叶结点外,其余的都是分支结点。
  • 结点的层数: 规定树的根结点的层数为 1,其余结点的层数等于它的双亲结点的层数加 1;
  • 树的深度: 树中全部结点的最大层数称为树的深度;
  • 路径、路径长度。假设一棵树的一串结点 n(1), n(2),  …, n(k)  有例如以下关系:结点 n(i) 是 n(i+1) 的父结点 (1≤i<k), 就把 n(1),n(2),…,n(k) 称为一条由 n(1) 至 n(k) 的路径。

    这条路径的长度是 k-1;

  • 满二叉树: 在一棵二叉树中,假设全部分支结点都存在左子树和右子树,而且全部叶子结点都在同一层上。
  • 全然二叉树: 深度为 K 的。有 N 个结点的二叉树,当且仅当其每个结点都与深度为 K 的满二叉树中按层序编号从 1 至 N 的结点一一相应;
  • 堆是一种全然二叉树,经常使用的排序算法、Dijkstra 算法、Prim 算法等都经常使用堆优化;
  • AVL树:它是最先发明的自平衡二叉查找树, 名字来源于其发明者,AVL 树中不论什么节点的两个子树的高度最大区别为 1, 查找、插入和删除在平均和最坏情况下都是 O(logn);

二叉树的重要的性质:

  • 性质1:在二叉树的第 i 层上至多有 2i-1 个结点 (i≥1);
  • 性质2:深度为 k 的二叉树上至多含 2k-1 个结点 (k≥1);
  • 性质3:对不论什么一棵二叉树,若它含有 n0 个叶子结点、n2 个度为 2 的结点,则:n0 = n2+1;
  • 性质4:具有 n 个结点的全然二叉树的深度为 log2n+1;
  • 性质5:若对含 n 个结点的全然二叉树从上到下且从左至右(即按层序)进行 1 至 n 的编号。则对全然二叉树中随意一个编号为 i 的结点:
    (1) 若 i=1,则该结点是二叉树的根,无双亲,否则。编号为 i/2  的结点为其双亲结点;
    (2) 若 2i>n。则该结点无左孩子。否则,编号为 2i 的结点为其左孩子结点。
    (3) 若 2i+1>n,则该结点无右孩子结点。否则,编号为 2i+1 的结点为其右孩子结点;

小实验(C 实现)

这里首先用一个数组生成一个全然二叉树(链式存储), 然后深搜用前序遍历,广搜借助自己实现的一个队列(链式存储)来进行。图例如以下所看到的:

代码为:

#include <stdio.h>
#include <stdlib.h>typedef struct Node {int data;struct Node * left;struct Node * right;
} BitNode, *BiTree;typedef BiTree QElemType;  // 定义队列元素类型typedef struct QNode {QElemType data;   // 存放树节点指针struct QNode *next;
} QNode, *QueuePtr;  // 队列节点和节点指针typedef struct LinkQueue {QueuePtr front, rear;
} LinkQueue; // 队列前后指针: 队首。队尾/* 初始化队列  */
int InitQueue(LinkQueue *Q) {QueuePtr s = (QueuePtr) malloc(sizeof(QNode));if (!s) return 0;Q->front = s;Q->rear = s;return 1;
}/* 入队 */
int EnQueue(LinkQueue *Q, QElemType e) {if (e == NULL)    return 0;QueuePtr s = (QueuePtr) malloc(sizeof(QNode));if (!s) return 0;s->data = e;s->next = NULL;Q->rear->next = s;Q->rear = s;return 1;
}/* 出队 */
int DeQueue(LinkQueue *Q, QElemType *e) {if (Q->front == Q->rear) {return 0;} // 首位指针相等。队列空,出队失败QueuePtr p;p = Q->front->next; // 头结点不放数据,其后继结点作为队首,出队*e = p->data;Q->front->next = p->next; // 队首指针后移一个节点if (Q->rear == p) {Q->rear = Q->front;} // 尾指针假设指向的是头结点后第一个节点,则令其指向队首指针。 即队列仅仅有一个数据节点的情况free(p);return 1;
}/* 利用数组 a 创建二叉树。递归的编写技巧在于设计好函数接口 */
void CreateTree(BiTree *bt, int a[], int len, int index) {if (index > len - 1)return;(*bt) = (BiTree) malloc(sizeof(BitNode));   // 指针变量初始化堆区的内存,c 用 malloc 函数(*bt)->data = a[index];(*bt)->left = NULL;   //  不能能省略,当其为叶节点时,指针域为 NULL,而且常作为程序推断条件(*bt)->right = NULL;CreateTree(&((*bt)->left), a, len, 2 * index + 1);CreateTree(&((*bt)->right), a, len, 2 * index + 2);
}/* 前序遍历二叉树 , 属于深度优先遍历 DFS */
void PreOrderTraverse(BiTree bt) {if (bt == NULL)return;printf("%d ", bt->data); // 操作节点数据PreOrderTraverse(bt->left);PreOrderTraverse(bt->right);
}/* 按层遍历,即广度优先遍历 BFS */
void BFSTraverse(BiTree bt) {LinkQueue *Q = (LinkQueue *) malloc(sizeof(LinkQueue));BiTree e;InitQueue(Q);EnQueue(Q, bt);while (Q->front != Q->rear) {DeQueue(Q, &e);printf("%d ", e->data);EnQueue(Q, e->left);EnQueue(Q, e->right);}
}int main() {int arr[] = { 0, 1, 2, 3, 4, 5, 6};BiTree root;CreateTree(&root, arr, sizeof(arr) / sizeof(int), 0);printf("PreOrderTraverse: ");PreOrderTraverse(root);printf("\nBFSOrderTravesre: ");BFSTraverse(root);return 0;
}/*
程序执行例如以下:
PreOrderTraverse: 0 1 3 4 2 5 6
BFSOrderTravesre: 0 1 2 3 4 5 6*/

【文章地址为:http://blog.csdn.net/thisinnocence】

算法学习笔记(六) 二叉树和图遍历—深搜 DFS 与广搜 BFS相关推荐

  1. 【算法学习笔记】二叉树的基本操作实现和应用举例,根据先序与中序遍历建立二叉树的实现

    基本操作 给某结点插入一个左孩子 删除二叉树中某结点的左子树 根据先序与中序遍历建立二叉树 应用举例 查找数据元素 二叉链表存储结构 统计叶结点的数目 基本操作 通常有:建立空二叉树.生成以X为根节点 ...

  2. 【算法学习笔记六】递归之归纳法

    基于递归的技术对于许多问题,使用递归使得使用简洁.易于理解和高效的算法来解决复杂问题成为可能(从算法的角度来看)递归最简单的形式是将问题分解成一个或多个子问题,这些子问题在结构上与原问题相同,然后将这 ...

  3. 数据结构与算法学习笔记——图 C++实现

    数据结构与算法学习笔记--图 C++实现 1 概念 2 图的表示方法 3 算法 3.1 拓扑排序 3.2 图的搜索算法 3.2.1 广度优先搜索(BFS) 3.2.2 深度优先搜索(DFS) 3.3 ...

  4. 吴恩达《机器学习》学习笔记六——过拟合与正则化

    吴恩达<机器学习>学习笔记六--过拟合与正则化 一. 过拟合问题 1.线性回归过拟合问题 2.逻辑回归过拟合问题 3.过拟合的解决 二. 正则化后的代价函数 1.正则化思想 2.实际使用的 ...

  5. opencv 手选roi区域_【opencv学习笔记六】图像的ROI区域选择与复制

    图像的数据量还是比较大的,对整张图片进行处理会影响我们的处理效率,因此常常只对图像中我们需要的部分进行处理,也就是感兴趣区域ROI.今天我们来看一下如何设置图像的感兴趣区域ROI.以及对ROI区域图像 ...

  6. Python最优化算法学习笔记(Gurobi)

    微信公众号:数学建模与人工智能 github地址:https://github.com/QInzhengk/Math-Model-and-Machine-Learning Python最优化算法学习笔 ...

  7. 基于MVS的三维重建算法学习笔记(五)— 立体匹配经典算法PatchMatch论文翻译及要点解读

    基于MVS的三维重建算法学习笔记(五)- 立体匹配经典算法PatchMatch论文翻译及要点解读 声明 问题提出 问题建模 通过PatchMatch获取平面参数--Inference via Patc ...

  8. 数据结构与算法学习④(哈夫曼树 图 分治回溯和递归)

    数据结构与算法学习④(哈夫曼树 图 回溯和递归 数据结构与算法学习④ 1.哈夫曼树 1.1.相关概念 1.2.哈夫曼树的构建 1.3.哈夫曼编码 1.4.面试题 2.图 2.1.图的相关概念 2.2. ...

  9. 数据结构与算法学习笔记15:最大流问题 / 二分图 / 有权无权二分图的匹配 / 匈牙利算法 / 银行家算法 / 稳定婚配

    数据结构与算法学习笔记15:最大流问题 / 二分图 / 有权无权二分图的匹配 / 匈牙利算法 / 银行家算法 / 稳定婚配 引入小题:最短路径 最大流问题(maximum flow problem) ...

最新文章

  1. assert()函数用法总结【转】
  2. springboot 和 mybatis整合:参数查询和动态sql
  3. 入门JavaScript?看懂这篇文章就够了!——Web前端系列学习笔记
  4. linux mysql 分区_Linux :linux磁盘分区(普通分区2T以内),安装免安装版mysql(tar.gz)...
  5. traceroute命令的用法实例
  6. spring security3 统计在线用户
  7. 痛苦并愉快的被洗着_品牌洗脑
  8. Activity使用Intent启动另一个Activity
  9. FreeMarker模板导出word报表
  10. 死磕 Java8 新特性,17 种日期处理方式!
  11. Android Toast的时长
  12. List集合分页操作
  13. Windows 桌面美化
  14. 2019-2021 文本生成图片 Text To Image(T2I) Synthesis 论文整理
  15. 找不到www.jetbrains.com的服务器IP地址
  16. 【计算机组成原理】微命令 微指令 微操作 微程序
  17. 证明婚内出轨的几种证据
  18. Excel的选取和函数常用技巧及快捷键(一)
  19. k8s.4-kubeadm部署高可用kubernetes集群 1.21
  20. 力天创见户外客流统计方案

热门文章

  1. python读取url中存储的数据_Python实现从URL地址提取文件名的方法
  2. mysql-8.0.14图文安装_mysql8.0.14安装配置方法图文教程(通用)
  3. robotac属于a类还是b类_所得税A类和B类的区别,什么样的属于B类??
  4. fit函数 model_函数式 API
  5. 静态内部类实现单例_为什么用枚举类来实现单例模式越来越流行?
  6. cenyos7安装 yum不可用_小区阳台隐形网横管不可用扁管,要改再去安装,还有问题...
  7. html 段前空格_前端 -- HTML
  8. 如何远程linux服务器桌面,LINUX操作系统如何远程登录桌面
  9. badusb代码_badusb攻击代码
  10. java自定义findbugs规则,定制 findbugs规则 - 阿里巴巴一个测试架构师 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...