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;
}