多叉树的含义
多叉树即为子结点有任意个的树,而在转换时所涉及的多叉树是一棵有序的多叉树,也就是其子结点的顺序是不能够随便交换的。
二叉树的定义
二叉树是每个结点最多有两个后件,且子树有左右之分(次序不能任意颠倒)。
多叉树转二叉树的作用
在用数组等表示或保存多叉树时,会浪费存储的空间,而且由于树中每个结点的度各不相同,在搜索过程中会比较的困难。而二叉树相对于多叉树便有了这些方面的优势,能够节省浪费的存储空间,又能使搜索变得简便快捷。因此可以通过将多叉树转换成为二叉树从而实现优化。
转换规则
假设多叉树为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.