阿里 2014-08-29 校招机试题 求一个存放整数的二叉树相差最大的两节点差值绝对值

题目:写一个函数,输入一个二叉树,树中每个节点存放了一个整数值,函数返回这颗二叉树中相差最大的两个节点间的差值绝对值。请注意程序效率。

如果是数值之差,感觉怎么着也得遍历一遍,直接修改下二叉树的基本遍历代码就可以。

#include<stdio.h>
#include <stdlib.h>

typedef struct Node {
	int data;
	struct Node * left;
	struct Node * right;
} BitNode, *BiTree;

/* 求差值的函数,传入一个二叉树,其中 *min, *max 初始放 root-data, *value 放差值即要求的值 */
void getValue(BiTree bt, int *min, int *max, int* value) {
	if(bt == NULL) return;
	if (*min > bt->data) *min = bt->data;
	if (*max < bt->data) *max = bt->data;
	*value = *max - *min;
	getValue(bt->left, min, max, value);
	getValue(bt->right, min, max, value);
}

void CreateTree(BiTree *bt, int a[], int len, int index) {
	if (index > len - 1)	return;
	(*bt) = (BiTree) malloc(sizeof(BitNode));
	(*bt)->data = a[index];
	(*bt)->left = NULL;
	(*bt)->right = NULL;
	CreateTree(&((*bt)->left), a, len, 2 * index + 1);
	CreateTree(&((*bt)->right), a, len, 2 * index + 2);
}

/* 两个小测试 */
int main() {
	int arr[] = { 0, 1, -9, 3, 4, 5, 6, 7};
	int arr2[] = { 0, 1, -9, 3, 10};
	BiTree root, root2;
	CreateTree(&root, arr, sizeof(arr) / sizeof(int), 0);
	CreateTree(&root2, arr2, sizeof(arr2) / sizeof(int), 0);
	int a, max = root->data, min = root->data;
	int a2, max2 = root2->data, min2 = root2->data;
	getValue(root, &max, &min, &a);
	getValue(root2, &max2, &min2, &a2);
	printf("%d, %d",a,a2);
	return 0;
}

// run result: 16, 19
时间: 2024-10-05 06:44:34

阿里 2014-08-29 校招机试题 求一个存放整数的二叉树相差最大的两节点差值绝对值的相关文章

2015年华为校招机试题和代码实现(分解字符串,拼音转数字,去除重复字符并排序,等式变换)

再来一套2015年的华为机试题. 第一题(60分): 按要求分解字符串,输入两个数M,N:M代表输入的M串字符串,N代表输出的每串字符串的位数,不够补0.例如:输入2,8, "abc" ,"123456789",则输出为"abc00000","12345678","90000000" 分析思路: 容易题 1.获得字符串的长度length后,判断与要输出位数N的大小,大于N的话,直接printf前N位字符,然

2014 华为校招机试题(c/c++开发类)

第一题: 1.2.3....n盏灯,同时有n个人, 第1个人将1的倍数的灯拉一下, 第2个人将2的倍数的灯拉一下, ...... 问最后有几盏灯是亮的, 初始状态下灯是灭的, 输入整数n(n<65536), 输出亮的灯数 方法解析:设置一个map,关键字为灯的编号,值为0或1,分别表示灯灭和灯亮状态,遍历map,第i个灯,将所有i倍数的灯进行一次取反操作,也可以通过数组实现.代码如下: [cpp] view plaincopy #include "stdafx.h" #inclu

2013 华为校招机试题

第一题: 删除字符串中所有给定的子串(40分)问题描述:在给定字符串中查找所有特定子串并删除,如果没有找到相应子串,则不作任何操作.要求实现函数:int delete_sub_str(const char *str, const char *sub_str, char *result_str)[输入] str:输入的被操作字符串,sub_str:需要查找并删除的特定子字符串[输出] result_str:在str字符串中删除所有sub_str子字符串后的结果[返回] 删除的子字符串的个数注:I.

&lt;2014 08 29&gt; MATLAB的软件结构与模块、工具箱简示

MATLAB的系统结构:三个层次.九个部分 ----------------------------------- 一.基础层 是整个系统的基础,核心内容是MATLAB部分. 1.软件主包MATLAB的构成 MATLAB语言 MATLAB的数学函数,提供丰富的数学函数库 MATLAB的图形处理系统,可视化 MATLAB的API,便于与其他软件交流,如数据库,VC等 MATLAB的工作环境 2.依附于MATLAB主包的有Compiler和Toolboxes Toolboxes是一个面向应用的具有更

pc2日记——有惊无险的第二天2014/08/29

今天下午如期的用pc2进行了第二场比赛.因为昨天的出错经历和早上充足的准备,下午的比赛尽管在開始的时候出了点小小的问题,但总的来说还是非常成功的. 早上八点过去504開始又一次配置client,由于开机清理程序的问题.我昨天弄的东西部分被清了.所以我今天得彻底的配置一下: 除了配置pc2client必要的ip和及快捷方式外.还得把清理程序改动一下.这样下次重新启动就不用再又一次配置了:本来昨晚打算用网络同传的,可是同传的是全部数据,显示要十几个小时.坑爹!还不如一台一台的弄呢! 于是,一个人忙活

华为机试题——求车速

描述: 一辆以固定速度行驶的汽车,司机在上午10点看到里程表(里程表有6位)上的读数 是一个对称数(即这个数从左向右读和从右向左读是完全一样的,例如95859公里). 两小时后里程表上出现了一个新的对称数.问该车的速度(公里/小时)是多少? 接口说明 原型: int CalcSpeedOfCar(int iCurrentMileage, int * piCarSpeed); 输入参数: int pcCurrentMileage:当前里程数(为对称数) (pcCurrentMileage ≤ 99

2014/08/29

早上处理一个补丁需求的验证,由于这个特性还没有合入到版本中,所以还不能验证,调了一些材料看了看,有一个关键字检查的工具,KeyWord_Chk.sh,但是不会用,师傅早上没来,昨晚上聚餐,PL出生小女庆祝,大家喝喝啤酒喝喝白酒,聊些新闻八卦的事情,其乐融融的就散了,回去后倒头就睡,早上还算清醒,没什么后遗症,可惜没有早餐吃,在单位门口小卖部买了个小面包和酸奶,居然要六元钱,都赶上KFC的早餐贵了,可惜这附近没有KFC,晚上去超市买点早餐吧,在家吃还是便宜,出来又吃不好又贵. 今天周五,明天加班,

华为机试题【9】-整数分割为2的幂次

题目描述: 一个整数可以拆分为2的幂的和,例如: 7 = 1+ 2 + 4 7 = 1 + 2 + 2 + 2 7 = 1 + 1 + 1 + 4 7 = 1 + 1 + 1 + 2 + 2 7 = 1 + 1 + 1 + 1 + 1 + 2 7 = 1 + 1 + 1 + 1 + 1 + 1 + 1 总共有六种不同的拆分方式 再比如: 4可以拆分成: 4 = 4, 4 = 1+1+1+1, 4 = 2+2, 4 = 1+1+2. 用f(n)表示n的不同拆分的种数,例如f(7) = 6. 要求:

求二叉树中相差最大的两个节点间的差值绝对值

题目描述: 写一个函数,输入一个二叉树,树中每个节点存放了一个整数值,函数返回这棵二叉树中相差最大的两个节点间的差值绝对值.请注意程序效率. solution: int findMinMax(BTNode *T) { if(!T) return 0; int max = INT_MIN; int min = INT_MAX; stack<BTNode*> s; s.push(T); while (!s.empty()) { BTNode *tmp = s.top(); if(tmp->d