数据结构-多叉树转二叉树

多叉树的含义
多叉树即为子结点有任意个的树,而在转换时所涉及的多叉树是一棵有序的多叉树,也就是其子结点的顺序是不能够随便交换的。
二叉树的定义
二叉树是每个结点最多有两个后件,且子树有左右之分(次序不能任意颠倒)。

多叉树转二叉树的作用
在用数组等表示或保存多叉树时,会浪费存储的空间,而且由于树中每个结点的度各不相同,在搜索过程中会比较的困难。而二叉树相对于多叉树便有了这些方面的优势,能够节省浪费的存储空间,又能使搜索变得简便快捷。因此可以通过将多叉树转换成为二叉树从而实现优化。

转换规则
假设多叉树为T,新转化的二叉树为K
(1)T中的结点与K中的结点一一对应。
(2)T中的某个结点N的第一个子结点为N1,则K中N1为N的左儿子结点
(3)T中的某个结点N的第i个子结点记为Ni(除第一个子结点),则K中Ni为Ni-1的右儿子结点(N2为N1的右儿子结点,N3为N2的右儿子结点)

转换示意图

【输入】
第一行仅一个数字n,表示有n个结点。之后n行,每行第一个数字为结点编号,后几个数字按顺序为该结点的子结点。每行以0结尾。
【样例输入】
18
1 2 3 4 0
2 5 6 0
3 7 0
4 8 9 10 0
5 0
6 11 12 0
7 0
8 0
9 13 14 0
10 0
11 15 0
12 0
13 16 17 18 0
14 0
15 0
16 0
17 0
18 0

【输出】
N行,每行第一个数字为结点编号,第二个为父结点,第三个为左结点,最后为右结点。
【样例输出】
1 0 2 0
2 1 5 3
3 2 7 4
4 3 8 0
5 2 0 6
6 5 11 0
7 3 0 0
8 4 0 9
9 8 13 10
10 9 0 0
11 6 15 12
12 11 0 0
13 9 16 14
14 13 0 0
15 11 0 0
16 13 0 17
17 16 0 18
18 17 0 0

Type
 Code=record
  Left,right,father,data:longint;
  end;
Var
 Tree:array[1..1000]of code;
 I,j,n,p:longint;
Begin
 Readln(n); i:=1;
 Fillchar(tree,sizeof(tree),0); {二叉树初始化}
 While i<=n do
  begin
   Read(tree[i].data);Read(j);
   If j<>0 then {j不是叶子}
    Begin
     tree[i].left:=j;tree[j].father:=I; {j为结点i的左儿子}
     P:=j;
    Repeat
     Read(j);
     If j<>0 then
      Begin
       Tree[p].right:=j;tree[j].father:={j为p的右儿子}
       P:=j;
     End;
     Until j=0;
    End;
    i:=i+1;readln;
  End;
  For i:=1 to n do 
   writeln(tree[i].data,’ ’tree[i].father,’ tree[i].left,’ ’tree[i].right);
End.

猜你喜欢

转载自blog.csdn.net/u013228808/article/details/85184519