注:本文主要思想来自文章: 有序树转二叉树!
在此谢谢原作者,我只是在看完后自己又动手写了一遍。
#include <stdio.h>
#include <iostream>
using namespace std;
//int flag = 0;
typedef struct BiTNode {
struct BiTNode *Child, *Brother; //孩子兄弟储存
int exist;
BiTNode() { //初始化
exist = 0;
Child = NULL;
Brother = NULL;
}
}BiTNode;
void CreateTree(BiTNode *T, int a, int b) { //创建树
if ((T + a)->exist == 1 && (T + a)->Child == NULL) { //孩子结点不空,创建为孩子结点
(T + a)->Child = (T + b);
(T + b)->exist = 1;
}
else if ((T + a)->exist == 1 && (T + a)->Child != NULL) { //已有孩子结点,创建兄弟节点
BiTNode *tt = NULL;
tt = (T + a)->Child;
while (tt->Brother) { //找到最右兄弟结点
tt = tt->Brother;
}
tt->Brother = (T + b);
(T + b)->exist = 1;
}
}
int Dep1(BiTNode *T) { //求深度
if (!T) return 0;
int m = Dep1(T->Child);
int n = Dep1(T->Brother);
if ((m + 1) > n) {
return m + 1;
}
else return n;
}
int Dep2(BiTNode *T) { //求深度
if (!T) return 0;
int m = Dep2(T->Child);
int n = Dep2(T->Brother);
if (m > n) {
return m + 1;
}
else return n + 1;
}
int main() {
int ca;
while (cin >> ca) {
BiTNode T[30010], *p;
//T = new BiTNode[ca];
p = T;
int flag = 0;
int x = 1;
for (int i = 0; i < ca - 1; i++){
int a, b;
cin >> a >> b;
if (flag == 0) {
(p + a)->Child = (p + b);
x = a;
(p + a)->exist = 1;
(p + b)->exist = 1;
flag = 1;
}
else {
CreateTree(p, a, b);
}
}
cout << Dep1(p + x) << " " << Dep2(p + x) << endl;
}
}