有序树转二叉树
注:本文主要思想来自文章: 有序树转二叉树!
在此谢谢原作者,我只是在看完后自己又动手写了一遍。
#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; } }