二叉树:
题目简述:
输入:第一行输入一个节点数N
下列N行每行输入一个节点的两个孩子节点,(所有节点data不一样)
输出深度(最大)
输入/输出样例:
#include<iostream>
#include<cmath>
using namespace std;
typedef struct Node {
int depth, num;
struct Node* lchild;
struct Node* rchild;
Node() { depth = 0, num = 0, lchild = rchild = NULL; }
}node;
node* root = new node();
int N, mmax = -1;
void Init() {
root->depth = 1;
root->lchild = root->rchild = NULL;
root->num = 1;
mmax = max(mmax, root->depth);
}
node* Find(int s,node *m) {
if (m->num == s) {
return m;
}
node* ans = NULL;
if (m->lchild != NULL) {
ans = Find(s, m->lchild);
}
if (ans != NULL) {
return ans;
}
if (m->rchild != NULL) {
ans = Find(s, m->rchild);
}
return ans;
}
node* CreatNode(int s) {
node* p = new node();
p->depth = -1;
p->num = s;
p->lchild = p->rchild = NULL;
return p;
}
void Creat(int n, int a, int b) {
node* m = Find(n, root);
node* lc = NULL;
if (a != 0) {
lc = CreatNode(a);
lc->depth = m->depth + 1;
mmax = max(mmax, lc->depth);
m->lchild = lc;
//m->rchild = rc;
}
else {
m->lchild = lc;
}
node* rc = NULL;
if (b != 0) {
rc = CreatNode(b);
rc->depth = m->depth + 1;
mmax = max(mmax, rc->depth);
m->rchild = rc;
}
else {
m->rchild = rc;
}
}
void Print(node* m) {
cout << m->num << " ";
if (m->lchild != NULL) {
Print(m->lchild);
}
if (m->rchild != NULL) {
Print(m->rchild);
}
}
int main() {
ios_base::sync_with_stdio(false);
Init();
cin >> N;
int i, a, b;
for (i = 1; i <= N; i++) {
cin >> a >> b;
Creat(i, a, b);
}
Print(root);
cout<<endl;
cout << mmax;
return 0;
}