将树转化为二叉树表示+如何将一棵树转化成二叉树+DFS

将树转化为二叉树表示

  • 二叉树重要

    • 因为所有的树都可以通过简单的转换,成为二叉树。
  • 一般的树,每个结点都会有n个分支,

  • 这样处理起不同的分支的树都需要重新设计一套操作方案,而且空指针的问题会比二叉树更加的严重。

  • 需将上图的树转换为二叉树,
    • 由N个分支转换为2个分支
  • 把每一个拥有同一父节点的子节点,
    • 也就是兄弟结点向右连接起来。
    • 保留最左边的父子连接,将其他的父子连接都打断,这时就可以产生一棵新的二叉树
  • 1是根结点

    • 2、3、4是兄
    • 保留最左边的2
    • 其与1为父子关系,2是1的左孩子。
    • 将34结点依次链接到2结点的右边。
  • 5、6是2的子结点

    • 5、6为兄弟,
    • 保留最左边的5结点
    • 6结点链接在5结点的右边
  • 7是3的子结点,

    • 7没有兄弟结
  • 8、9、10是4结点的子结点

    • 则保留最左边的8结点与4为父子关系,
    • 8是4的左孩子,
    • 9 10结点依次连接在8结点右边

如何将一棵树转化成二叉树

  • 从根结点开始,从上到下,
  • 看每一个结点,
    • 把你正在看的结点的孩子放在左子树,兄弟放在右子树。

  1. 将 节点的孩子 放在左子树;

  2. 将 节点的兄弟 放在右子树。

  • 另一种理解方法:
  • 1.在所有兄弟结点之间加一连线
  • 对每个结点,除了保留与其长子的连线外,去掉该结点与其它孩子的连线。

DFS的代码

w=第一个点
for every vertex v adjacent to w
	if(v has not been visted):
		visit v;
	w=v;

end

  • 我觉得还是看真正的源代码把
  • 下面这个是真的伪代码

注意这里,如何DFS时候将每个点标记,就是第几个访问的意思,这里的count是全局变量。

图的DFS(Depth-First-Search)

在这里插入图片描述

  1. 图上随找一点 为初,取A点;此时遍到A!
  2. 然后找到B点,那B点成第二遍点!

在这里插入图片描述第二步完成后图,红表到B而过的边

  1. 复步2,就遍到C。
    在这里插入图片描述三步完后图,红表遍到C点过边

  2. 此时到D点啦!
    在这里插入图片描述4步完后图,红表遍到C点过边

  3. 然后我们再找与D点相联系的点,从D点发的这遍啥也没找着!!
    在这里插入图片描述五步完后图,红表遍到C点过边

  4. 那第六步干啥呢??实际上四步到了C时,有两点可走,一是D,另一E,当时走了D点,这一部分已在五步成了!第六步它要做从C遍历到E这个步!我们到达了E点!!
    在这里插入图片描述6步完后图,红表遍到C点过边

  5. E点这个时候发现遍历到了F点!
    在这里插入图片描述7步完后图,红表遍到C点过边

  6. F点这个时候发现啊,遍历到G.
    在这里插入图片描述8步完后图,红表遍到C点过边

  7. 此时遍历到了G点,从G点出发的这个遍历一无所获。
    在这里插入图片描述9步完后图,红表遍到C点过边

  8. 第十步做什么?看步骤7中,E点可走两,F这条路在步骤9被终结,十步走的实际上是从E出发遍历G,但发现自己无法遍历G。so十步骤啥也没干!注此时点停在了E!

  9. A点刚开有两路可走,A走B封死了!去遍E,发现自己无法遍E!所以A点失败了!至此,程序退出!

DFS生成树

红线连起,选A为根,七点成树,叫做DFS生成树

不唯一。

黑边不在生成树里,但在原来的图中是有的,我们称它为余边!DFS有1特!

  1. 原图里有连线的两点,在DFS生成树里,定是祖和孙关系!

  2. 对于节点A,他的多颗子树之间必然无余边!!!!!!!!,也就是说余边

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页