首页 > 其他分享 >二十、树、森林和二叉树(二叉链表)转换

二十、树、森林和二叉树(二叉链表)转换

时间:2022-11-07 23:34:31浏览次数:36  
标签:表示法 结点 二叉 链表 二叉树 森林

一、孩子兄弟表示法

孩子兄弟表示法又称二叉树表示法,或二叉链表表示法,即以二叉链表做树的存储结构。链表中结点的两个链域分别指向该结点的第一个孩子结点和下一个兄弟结点,分别命名为firstchild域和nextsibling域。

// 树的二叉链表(孩子——兄弟)存储表示
typedef struct CSNode
{
    ElemType data;
    struct CSNode *firstchild, *nextsibling;
}CSNode, *CSTree;

二、树、森林和二叉树(二叉链表)转换

孩子兄弟表示法又称二叉树表示法,或二叉链表表示法,即以二叉链表做树的存储结构。链表中结点的两个链域分别指向该结点的第一个孩子结点和下一个兄弟结点,分别命名为firstchild域和nextsibling域。

从树的二叉链表表示的定义可知,任何一棵和树对应的二叉树,其根结点的右子树必空。若把森林中第二棵树的根结点看成是第一棵树的根结点的兄弟,则同样可导出森林和二叉树的对应关系。

树转换为二叉树的规则:每个结点左指针指向它的第一个孩子,右指针指向它在树中的相邻右兄弟,这个规则又称“左孩子右兄弟”。

将森林转换为二叉树的规则与树类似。先将森林中的每棵树转换为二叉树,由于任何一棵和对应的二叉树的右子树必空,若把森林中第二棵树根视为第一棵树根的右兄弟,即将第二棵树对应的二叉树当作第一棵二叉树根的右子树,将第三棵树对应的二叉树当作第二棵二叉树根的右子树……以此类推,就可以将森林转换为二叉树。

二叉树转换为森林的规则:若二叉树非空,则二叉树的根及其左子树为第一棵树含二叉树形式,故将根的右链断开。二叉树根的右子树又可视为一个由除第一棵树外的森林转换后的二叉树,应用同样的方法,直到最后只剩一棵没有右子树的二叉树为止,最后再将每棵二叉树依次转换成树,就得到了原森林,二叉树转换为树或森林是唯一的

标签:表示法,结点,二叉,链表,二叉树,森林
From: https://www.cnblogs.com/haibersut/p/16867887.html

相关文章

  • 二叉树相关上机实验
    #include<stdio.h>#include<malloc.h>#defineOK1#defineERROR0#defineMAXNUM20typedefintStatus;typedefstructbnode{intdata;structbnode......
  • 617. 合并二叉树
    给你两棵二叉树: root1 和 root2 。想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的......
  • 【数据结构-链表】链表的相关算法
    目录1删除元素1.1删除值为x的所有结点1.1.1不带头结点的单链表1.1.2带头结点的单链表1.2删除重复元素1.2.1不带头结点的单链有序表1.2.2带头结点的单链有序表2链......
  • 543. 二叉树的直径
    给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。示例:给定二叉树1......
  • 538.把二叉搜索树转换为累加树
    给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(GreaterSumTree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。提醒一下,二......
  • 根据遍历序列确定二叉树
    二叉树的还原由二叉树的先序序列和中序序列,或由其后序序列和中序序列均能唯一地确定一棵二叉树。根据定义,二叉树的先序遍历是先访问根结点,其次再按先序遍历方式遍历根结......
  • 二叉树、平衡二叉树、红黑树、B树、B+树
    二叉树基于二叉查找树的这种特点,在查找某个节点的时候,可以采取类似于二分查找的思想,快速找到某个节点。n个节点的二叉查找树,正常的情况下,查找的时间复杂度为O(logN)。......
  • 023 通过链表学Rust之非安全方式实现链表1
    介绍视频地址:https://www.bilibili.com/video/av78062009/相关源码:https://github.com/anonymousGiga/Rust-link-list链表定义我们重新定义链表如下:pubstructList<T>{......
  • 022 通过链表学Rust之为什么要非安全的单链表
    介绍视频地址:https://www.bilibili.com/video/av78062009/相关源码:https://github.com/anonymousGiga/Rust-link-list详细内容前面我们都是使用安全的Rust编程来实现链表,但......
  • 025 通过链表学Rust之使用栈实现双端队列
    介绍视频地址:https://www.bilibili.com/video/av78062009/相关源码:https://github.com/anonymousGiga/Rust-link-list详细内容本节我们使用栈来实现双端队列。实现栈栈的实......