P4715 【深基16.例1】淘汰赛

1、首先从题干要求入手,我们可以了解到题目要求是二进一,不难想到这是二叉树的题

2、再来,从题干可以知道,我们所采用的结构体除了需要有树的两个左右节点指针外,还需要两个变量用来储存“能力值”和“编号”

3、在这道题中,我们需要先给叶子节点初始化父节点,然后再传值给函数插入叶子节点

4、再然后对左右节点进行比较,将大的值赋给父节点,并递归调用该函数

5、最后,访问根节点的左右子树,判断那个小,输出它的编号即可。

二叉树很吃递归思想。我递归不是很好,写的代码是屎山,right还拼错了,随便看看吧

#include<iostream>
using namespace std;
int cnt = 0;//记录插入子节点的个数
int shujiedian = 1;//测试节点插入是否正确
class shu
{
public:
	int val;
	int bh;
	shu* rigth;
	shu* left;

public:
	shu()
	{
		val = 0;
		bh = -1;
		rigth = NULL;
		left = NULL;
	}

	shu(int v)
	{
		val = v;
		bh = ++cnt;
		rigth = NULL;
		left = NULL;
	}


};

void insert_val(shu* p)//插入叶子节点的值
{
	int r, l;//左右两的值
	if (p->left != NULL)
	{
		insert_val(p->left);
	}
	else
	{
		cin >> r;
		cin>> l;
		shujiedian+=2;
		p->left = new shu(r);
		p->rigth = new shu(l);
		return;
	}
		insert_val(p->rigth);
}

void insert_null(shu* p)//初始化父节点
{
	if (p->left != NULL)
	{
		insert_null(p->left);//递归访问左节点
		
	}
	else
	{
		p->left = new shu;
		p->rigth = new shu;
		shujiedian+=2;
		return;
	}
		insert_null(p->rigth);
}



void insert(shu &t,int n)
{
	shu* point = &t;

	for (int i = n; i >1; i--)//这里大于1是因为叶子节点不用初始化
	{
		insert_null(point);
	}

	insert_val(point);

}

void set(shu* p)
{

	if (p->left != NULL&&p->left->val==0)//递归到最底层的空节点
	{
		set(p->left);
	}
	else 
	{
		if (p->left->val > p->rigth->val)//父节点赋值子节点的max
		{
			p->val = p->left->val;
			p->bh = p->left->bh;
		}
		else
		{
			p->val = p->rigth->val;
			p->bh = p->rigth->bh;
		}
		return;
	}

	set(p->rigth);


}


int main()
{
	int n;//n的值就是需要插入节点的层、数
	shu p;
	cin >> n;
	insert(p, n);
	for(int i=0;i<n;i++)
		set(&p);//因为set每次只能给一层父节点赋值,所以需要遍历n次
	
	
	
	//cout << p.left->left->bh<<endl;
	//cout << p.left->rigth->bh;

	if (p.rigth->val > p.left->val)
	{
		cout << p.left->bh;

	}
	else
	{
		cout << p.rigth->bh;
	}


	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值