找树根和孩子(C++)

【问题描述】

 给定一棵树,输出树的根root,孩子最多的结点max以及他的孩子

【输入格式】

第一行:n(结点数<=100),m(边数<=200)。  

以下m行;每行两个结点x和y,表示y是x的孩子(x,y<=1000)。

【输出格式】

第一行:树根:root。

第二行:孩子最多的结点max。

第三行:max的孩子,按照从小到大的顺序输出。

【输入样例】

9 8
1 2
1 3
1 4
2 5
2 6
7 8
7 9
4 7

【输出样例】

1
1
2 3 4
#include<bits/stdc++.h>
using namespace std;


struct node{
	int data;
	int father;
	int sonnum=0;
	int son[10000];
};
node tree[10000];


int n,m,x,y,a=INT_MIN;


int main(){
    cin>>n>>m;
    
    
    for(int i=0;i<m;i++){
		cin>>x>>y;
		tree[y].father=x;
		a=max(a,x);
		tree[x].son[tree[x].sonnum+1]=y;
		tree[x].sonnum++;
	}
	
	
	for(int i=1;i<=a;i++){
		if(tree[i].father==0){
			cout<<i<<endl;
			break;
		}
	}
	
	
	int b=INT_MIN,c;
	for(int i=0;i<=a;i++){
		if(tree[i].sonnum>b){
			c=i;
			b=tree[i].sonnum;
		}
	} 
	cout<<c<<endl;
	sort(tree[c].son,tree[c].son+b);
	
	for(int i=1;i<=b;i++){
		cout<<tree[c].son[i]<<' ';
	}cout<<endl;
	
	return 0;
}

 

  • 9
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,我可以给你一些关于红黑树的信息。 红黑树是一种自平衡二叉搜索树,具有以下性质: 1. 节点是红色或黑色。 2. 根节点是黑色。 3. 每个叶子节点(NIL)是黑色。 4. 每个红色节点的两个子节点都是黑色。 5. 从任一节点到其叶子节点的所有路径都包含相同数目的黑色节点。 以下是一个用 C 语言实现的红黑树的示例代码: ``` #include <stdio.h> #include <stdlib.h> typedef struct _rbtree { int key; char color; struct _rbtree *left; struct _rbtree *right; struct _rbtree *parent; } rbtree; #define NIL &sentinel /* all leafs are sentinels */ rbtree sentinel = { 0, 'B', NIL, NIL, NIL }; void insert(rbtree *tree, int key); void delete(rbtree *tree, int key); void search(rbtree *tree, int key); void rbtree_print(rbtree *tree); int main(int argc, char **argv) { rbtree *root = NIL; insert(root, 5); insert(root, 10); insert(root, 15); insert(root, 20); insert(root, 25); rbtree_print(root); delete(root, 15); delete(root, 20); rbtree_print(root); search(root, 25); search(root, 30); return 0; } void insert(rbtree *tree, int key) { rbtree *current, *parent, *x; /* find future parent */ current = tree; parent = 0; while (current != NIL) { if (key == current->key) return; parent = current; current = key < current->key ? current->left : current->right; } /* setup new node */ if ((x = malloc (sizeof(*x))) == 0) return; x->key = key; ### 回答2: 红黑树是一种自平衡的二叉查树,可以通过颜色属性来保持平衡。下面是用C语言实现红黑树的大致步骤: 1. 定义红黑树的结构体:包括节点的关键字、颜色、父节点、左孩子、右孩子等属性。 2. 实现红黑树的基本操作函数:包括插入、删除、搜索、旋转等。 3. 实现插入操作:插入节点时,首先按照二叉查树的规则到合适的位置,然后根据红黑树的规则调整颜色和结构,确保树的平衡性。 4. 实现删除操作:删除节点时,首先处理删除节点的子节点情况,然后根据红黑树的规则调整颜色和结构,确保树的平衡性。 5. 实现搜索操作:按照二叉查树的规则搜索指定关键字的节点。 6. 实现旋转操作:包括左旋和右旋操作,用于调整树的结构。 通过上述步骤,可以完成红黑树的基本实现。在实际使用中,可以根据具体需求扩展并优化红黑树的功能。 ### 回答3: 红黑树是一种自平衡的二叉搜索树,它具有一些特殊的性质。为了用C语言实现红黑树,我们可以按照以下步骤进行: 1. 定义红黑树的结构体 首先,我们需要定义红黑树的结构体。结构体包含一个指向树根的指针和其他必要的变量,例如,节点的颜色。 2. 实现基本的操作函数 我们需要实现红黑树的基本操作函数,包括插入、删除和查。这些函数将根据红黑树的性质进行相应的操作,以保持树的平衡。 3. 实现节点的插入 在插入节点时,我们需要按照二叉搜索树的规则到插入位置,并进行一系列的旋转操作以保持红黑树的性质。 4. 实现节点的删除 节点的删除涉及到红黑树性质的调整,它不同于普通二叉搜索树的删除。在删除节点后,我们需要对树进行旋转操作和重着色以保持平衡。 5. 实现查函数 查函数通过遍历红黑树并比较节点的值,到目标节点并返回。这个函数可以按照二叉搜索树的查方式实现。 通过以上步骤,我们可以实现一个红黑树的基本功能。当然,红黑树还有一些高级操作,例如,RB-Insert-Fixup 和 RB-Delete-Fixup,用于处理插入和删除时的特殊情况。这些操作会在插入和删除函数中被调用。 总之,用C语言实现一个红黑树需要定义适当的数据结构,并编写相应的插入、删除和查函数,同时保持树的平衡性质。完成这个任务需要一定的知识和编程经验,但通过充分理解红黑树的性质和操作,我们可以很好地完成这个任务。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值