C++知识点 图论(树)

一:图论的概念

       图是表示物件与物件之间的关系的数学对象,是图论的基本研究对象。

       图和以前所学的变量数组栈这类的东西最大的不同就是直观,通过一个图就可以说明几十行表达式所要表示的关系。

       最基本的图由点和线构成,一个个离散的点代表着研究的对象,它们被称之为结点,而把它们串联起来的这些线我们称之为边。

       图能够表达晦涩难懂的文字,用图解题会更为好懂。

       图还分为有向图无向图之类的,下文看题会有涉及。

二:图论能干的事

       图论最大的作用就是搜索,包括BFS和DFS,这叫做图遍历。

       广搜和深搜是用于在图中搜索节点的两种不同算法。它们通常用于确定我们是否可以从给定节点到达某个节点。

       BFS的目的是尽可能接近根节点遍历图,而DFS算法旨在尽可能远离根节点。

       最基本的题型精简一下就是下边这样

       从A到B的最短途径是什么?分别从距离和时间角度考虑。

       有没有办法从C到D?

       典型的搜索本子题叭


(以下干货时间)

三:图论中常用的知识点(性质)

      ①连通性

         任何两个顶点之间都可以通过一条路连接,这样的图称为连通的。相反称为不连通的。

         这就像只考虑铁路运输的时候,亚欧大陆显然是一个连通图(内陆岛屿不算!),而由于海洋的存在,它跟美洲大陆就挨不到一起,他俩放在一起就不是一个连通的图。

     ②树

        树比图论学的早真是令人匪夷所思,树作为图的一种,在代码领域运用极其广泛。

        一棵树主要由爸爸和儿子构成...

       哦不说错了,是子节点和父节点

       每个结点有零个或多个子结点;没有父结点的结点称为根结点;每一个非根结点有且只有一个父结点;除了根结点外,每个子结点可以分为多个不相交的子树

       这货真画出来根本不像棵树...你要把它倒过来看才能发现被称作树的真谛

       树里面最为常用的一棵(一种)就是二叉树,主要是因为所有的树经过改造都能变成它...它也因为所解决的问题不同被赋予了不同的名称

       空二叉树//只有一个根结点的二叉树//只有左子树//只有右子树//完全二叉树

       对于完全二叉树的问题则极为重要,因为它代表着完成一个计划的所有情况,搜索和DP往往就在完全二叉树中进行

      深度则指的是二叉树的高度,也就是所谓的家里几代人

      而普通树转二叉树,一般采用左“子女”右“兄弟”的方式来转化,一步一步对应走便可以得到需要的二叉树。

四:算法本子

       又到了喜闻乐见的模板时间了,这次写出来的是二叉树中的搜索

//首先我们先得有棵树叭
//先写结点
typedef struct node
{

int data; 
struct node* left;
struct node* right;
} Node;
//再写树根
typedef struct
{Node* root;} Tree;
//现在就可以声明(构造)一棵树了

  oid insert(Tree* tree,int value)
  {
  Node* node=(Node*)malloc(sizeof(Node));
  node->data = value;
  node->left = NULL;
  node->right = NULL;
  }

//一棵树的构造就完成了

       但是搜索的核心在于哪里?

       遍历!也就是所有的点都去找一遍,不管是树还是数组,都找一遍就能出来。

      判断树是不是空树之类的代码就不写了,直接上遍历

void inorder(Node* node)
{
    if (node != NULL)
    {
        inorder(node->left);
        printf("%d ",node->data);
        inorder(node->right);
    }
} 

     这里用的是最常见的中序遍历,其他什么先序后序层次之类的遍历其实我也就听过...等碰到题的时候再说叭

      

     

       

原文地址:https://www.cnblogs.com/Jiangxingchen/p/12726373.html