1.前言
题目描述
由浅到深、从左到右给出二叉树中每个节点的子节点,使用一维数组顺序储存该二叉树的节点(根节点的下标为1,若某节点的下标为i,其左孩子位于下标2i处右孩子位于下标2i+1处),求该数组最大下标至少是多少。
输入格式
第一行输入一个整数N,代表二叉树一共有N个结点(n <= 26)。接下来N行每行三个字符均为小写字母或*。中间用空格隔开。由浅到深、从左到右给出每个节点的左孩子和右孩子。不存在则为星号。
输出格式
输出一行,一个正整数,为该数组的最大下标至少是多少。
输入样例
6
a b c
b * *
c d e
d * *
e * f
f * *
输出样例
15
2.理解题意
可能你会想二叉树明明只有两个叉为什么每行有三个字符呢?
那你就要看一下下面的图片了:
只要有星号的话,星号在哪边哪边就没有
题目给的测试样例,最后合成的图是:
3.思路
想到二这个数字,往往会让我想到二进制,我们可以让左代表0右代表1
用题目给的输入样例合成的图,用二进制计算一下(字符的右边是它的二进制码):
我们可以看到F的二进制码是最大的。
1111转成十进制是15.
所以我们这种方法是可行的。
4.代码
记得加头文件:
#include <iostream>
#include <cmath>
using namespace std;
二进制转换:
int n_ten(string num,int n){
int num2[10001];
int len = num.length();
int sum=0,e;
for (int i=0; i < len; i++){
if (num[i] > 96){
num2[i] = (num[i]-96)+9;
}
else{
num2[i] = num[i]-48;
}
}
int j = len;
for (int i=0; i < len;i++){
j --;
e = num2[i] * pow(n,j);
sum += e;
}
cout << sum << " ";
return sum;
}
个人喜好(pow)
输入
int main() {
int n;
cin >> n;
char j_d[27],f_c[27][2];
for (int i =0; i < n; i++){
cin >> j_d[i] >> f_c[i][0] >> f_c[i][1];
}
return 0;
}
6
a b c
b * *
c d e
d * *
e * f
f * *
红色的字符: j_d
其他字符:f_c
核心代码:
string num[27];
int top = 1;
num[top] = "1";
top ++;
for (int i =0; i < n; i++){
if (f_c[i][0] != '*'){
string l = num[top-1];
num[top] = l+"0";
top ++;
}
if (f_c[i][1] != '*'){
if (f_c[i][0] != '*'){
string l = num[top-2];
num[top] = l+"1";
top ++;
}
else{
string l = num[top-1];
num[top] = l+"1";
top ++;
}
}
}
num是按照j_b的顺序,对应的字符二进制代码.
输出
for (int i = 1; i <= top-1; i++){
cout << j_d[i-1] << ":";
n_ten(num[i],2);
cout << "\n";
}
cout << "最大下标:";
n_ten(num[top-1],2);
这个程序,输出的时候,我不仅让他输出了最大下标,我还让他输出了每个字符对应的下标(那个循环).