/**
* @author wb
*
* 森林、树和二叉树之间的转换
* 有序树、森林和二叉树之间有一一映射的关系,可以相互转换。
* 多叉树向二叉树转换的方法如下:
* (1)加虚线:同一个父节点的相邻兄弟节点之间加虚线。
* (2)抹实线:每个节点只保留它与最左子节点的连线,与其他子节点的连线都抹掉。
* (3)虚改实:虚线改为实线。
* 例如,如图所示就是多叉树向二叉树转换的结果:
* A A
* │││ │ │ │ │
* B────┘CD E F └─────G B───┘
* │││ ││ │ ---> ││
* G─┘HI J─┘└─K L G────┘└──C
* ││ │ │ ││ │
* M─┘N O P M───┘└──H └──D
* │ │ │
* └──N └── I └──E
* ││
* J──┘└──F
* ││
* O──┘└──K
* │
* 图11.12多叉树转换为二叉树 P
*
* 多叉树转换成二叉树的思想就是:所有子节点只保留子节点,其他子节点转换为左子节点的右子节点链。
* 按照这种思路,森林也可以转换成二叉树——只要把森林当成一棵根节点被删除的多叉树即可。如下图所示将森林转换成二叉树的结果:
* A B C A
* │││ │││ │││ │ │
* D──┘E└─F G─┘H└─I J─┘K└─L D─────┘ └────B
* │││ ││ ││ ││ ---> ││ ││
* M─┘N└O P└Q R┘└S T┘└U M──┘└──E G─┘└─────C
* ││ ││ ││ ││ ││ │
* V┘└W X┘└Y V─┘└─N P┘└─F R┘└H J──┘
* │ │ │ │ │ ││
* └W └O └Q └S └I T┘└─K
* │ │ │
* X─┘ └U └─L
* │
* 图11.13 森林转换为二叉树 └Y
*
* 反过来,二叉树也可恢复出对应的多叉树、森林,恢复方法如下:
* (1)加虚线:如某节点I是父节点的左子节点,则为该节点I的右孩子链的所有节点分别与节点I的父节点添加连线。
* (2)抹线:把有虚线的节点与原父节点的连线抹去。
* (3)整理:虚改实并按层排列。
* 如下图所示把二叉树转化为多叉树。
* A A
* │ ││ ││
* B─┘ B─┘D F└─G
* ││ ---> │ │
* C─┘└─D B┘ E┘
* ││
* E─┘└F
* │
* └G
* 图11.14 二叉树转换为多叉树
* 如下图所示把二叉树转化为森林。
* A A C E
* ││ ││ ││
* B─┘└─C B─┘└─D F─┘└─H
* │ │ │
* └D └E ---> G─┘
* │
* F─┘
* ││
* G─┘└─H
* 图11.15 二叉树转换为森林
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * 如果二叉树的根节点的右子节点链只有一个节点,那么转换出来的森林将有两棵树; *
* * 如果二叉树的根节点的右子节点链有N个节点,那么转换出来的森林将有N+1棵树。 *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*/
Java基础 - 多叉树、森林和二叉树之间的转换
最新推荐文章于 2024-08-11 03:15:06 发布