关于完全二叉树的一道面试题

这是一道关于完全二叉树的面试题,要求根据输入数据构建完全二叉树并找出从根节点到叶节点的最大路径长度。解题思路包括动态创建二叉树节点,利用完全二叉树特性记录节点值,以及避免使用递归方法。相关代码展示了一种非递归的解决方案,同时讨论了在构建二叉树过程中的难点和注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

存在一棵完全二叉树,从键盘输入一组数据,并将数据从二叉树的根结点顺序存入每个结点 ,输出从根结点到叶结点最大的路径长度。

输入描述:

输入第一行为完全二叉树的结点数 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值