树(努力更新中……)

二叉树:
题目简述:
输入:第一行输入一个节点数N
下列N行每行输入一个节点的两个孩子节点,(所有节点data不一样)
输出深度(最大)
输入/输出样例:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201202200635588.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FqZ2Nxag==,size_16,color_FFFFFF,t_70

#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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值