题目描述
存在一棵完全二叉树,从键盘输入一组数据,并将数据从二叉树的根结点顺序存入每个结点 ,输出从根结点到叶结点最大的路径长度。
输入描述:
输入第一行为完全二叉树的结点数 n。
输入第二行为对应的的所有整数,用空格隔开。
输出描述:
输出最大的路径长度
示例:
输入:
7
5 4 3 10 5 9 2
输出:
19
解题思路
1、该题目实际上是有一定难度的,需要边建立二叉树一边赋值,而且数值并不是已经存好的数值,需要在程序运行时手动输入,如果用递归的方法建树,结点赋值就会出现一个很大的问题,所以,本题目不考虑递归方法。
2、可以动态创立一组长度为nnn的二叉树类型数组,可以一边创建结点,一边为从键盘上为结点赋值,再通过完全二叉树的性质,更改父结点左右指针的指向即可创建二叉树,这样就为动态的为结点插入数据提供了便利。
3、本题目要求返回二叉树的最大带权路径长度(区别于哈夫曼树中的带权路径长度(WPL)的定义,该问题不乘路径长度值),即二叉树中结点数值之和最大的路径,思路可以是一边在父结点指针指向左右孩子结点,一边用一个数组记录父结点与其孩子结点的权值累加,这样在创建二叉树结束后,数组中就可以记录每一个叶子结点到父结点的路径之和,返回最大值即可。
4、搞懂本题目的同学可以清楚地知道,只要建立一个int类型的数组,然后通过完全二叉树的性质,用另一个数组记录叶子结点到父结点的权值之和即可,完全没有必要建立二叉树结点这一系列工作。对,你的想法是正确的,我之所以这么写,是为了让你了解二叉树的相关知识而已。
相关代码
#define _CRT_SECURE_NO_WARNINGS // 也可以将该宏定义放入到VS项目的属性中
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct BITNODE
{
int data;
struct BiTNode *left, *right;
}BiTNode, *BiTree;
BiTree CreateBiTree(int n,int* arr) // 创建结点数为n的完全二叉树
{
BiTree biTreeArr = (BiTree)malloc(sizeof(BiTNode)* n);// 创建个数为n的二叉树结点
if (biTreeArr == NULL)
{
printf("创建二叉树类型的数组失败!\n");
return NULL;
}
printf("请依次输入%d个整数:\n", n);
int num = 0; // 用于存放键盘中输入的数据
for (int i = 0; i < n; i