二叉树求最大下标

文章讲述了如何将二叉树的节点关系用一维数组表示,通过二进制编码方法计算出每个节点的下标,最终确定给定二叉树数组的最大下标。作者提供了代码示例来解释这个问题和解决方案。
摘要由CSDN通过智能技术生成

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

这个程序,输出的时候,我不仅让他输出了最大下标,我还让他输出了每个字符对应的下标(那个循环).

如果有问题的话在评论区说

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值