阿里巴巴笔试题--二叉树(知识复习与整理)

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

完整的二叉树建立,先序遍历,中序遍历,后序遍历,统计叶子结点个数,输出叶子结点,输出结点最大值,最小值,以及最大值与最小值的差。

#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;

typedef char DataType_char;
typedef int DataType_int;
typedef struct Node
{
	DataType_int data;
	struct Node *LChild;
	struct Node *RChild;
}BiTNode,*BiTree;

void Visit(DataType_int a)//输出各节点
{
	cout<<a<<" ";
}

//先序建立二叉树
BiTree InitTree()
{
	DataType_char ch;
	BiTree T;
	cin>>ch;
	if(ch=='.') T=NULL;//空结点用'.'代替
	else
	{
		T=(BiTree)malloc(sizeof(BiTNode));
		T->data=ch-'0';
		T->LChild=InitTree();
		T->RChild=InitTree();
	}
	return T;//返回根节点
}

void PreOrder(BiTree root)//先序遍历
{
	if(root!=NULL)
	{
		Visit(root->data);
		PreOrder(root->LChild);
		PreOrder(root->RChild);
	}
}

void InOrder(BiTree root)//中序遍历
{
	if(root!=NULL)
	{
		InOrder(root->LChild);
		Visit(root->data);
		InOrder(root->RChild);
	}
}

void PostOrder(BiTree root)//后序遍历
{
	if(root!=NULL)
	{
		PostOrder(root->LChild);
		PostOrder(root->RChild);
		Visit(root->data);
	}
}

//先序遍历输出二叉树的叶子结点,root为指向二叉树根结点的指针
void Pre_Leaf(BiTree root)//求叶子结点
{
	if(root!=NULL)
	{
		if((root->LChild==NULL)&&(root->RChild==NULL))
		{
			Visit(root->data);
		}
		Pre_Leaf(root->LChild);
		Pre_Leaf(root->RChild);
	}
}

int Pre_Leaf_Value(BiTree root)//求叶子结点个数
{
	static int count=0;
	if(root!=NULL)
	{
		if((root->LChild==NULL)&&(root->RChild==NULL))
		{
			count++;
		}
		Pre_Leaf_Value(root->LChild);
		Pre_Leaf_Value(root->RChild);
	}
	return count;
}

int Max(BiTree root)//返回最大值
{
	static int max;
	static int i=0;
	if(root!=NULL)
	{
		if(i==0)
		{
			max=root->data;
			i++;
		}
		if(root->data>max)
			max=root->data;
		Max(root->LChild);
		Max(root->RChild);
	}
	return max;
}

int Min(BiTree root)//返回最小值
{
	static int min;
	static int i=0;
	if(root!=NULL)
	{
		if(i==0)
		{
			min=root->data;
			i++;
		}
		if(root->data<min)
			min=root->data;
		Min(root->LChild);
		Min(root->RChild);
	}
	return min;
}

int Max_Min(BiTree root)//求最大值与最小值的差
{
	static int min,max,i=0;
	if(root!=NULL)
	{
		if(i==0)
		{
			min=root->data;
			max=root->data;
			i++;
		}
		if(root->data>max)
			max=root->data;
		if(root->data<min)
			min=root->data;
		Max_Min(root->LChild);
		Max_Min(root->RChild);
	}
	return max-min;
}

int main()
{
	BiTree T;
	T=InitTree();

	cout<<"二叉树的先序遍历:";
	PreOrder(T);
	cout<<endl;

	cout<<"二叉树的中序遍历:";
	InOrder(T);
	cout<<endl;

	cout<<"二叉树的后序遍历:";
	PostOrder(T);
	cout<<endl;

	cout<<"先序遍历输出二叉树的叶子结点:"<<endl;
	cout<<"个数:"<<Pre_Leaf_Value(T)<<endl;
	Pre_Leaf(T);
	cout<<endl;

	cout<<"结点最大的值:"<<Max(T)<<endl;
	cout<<"结点最小的值:"<<Min(T)<<endl;

	cout<<"最大结点与最小结点的差:"<<Max_Min(T)<<endl;

	system("pause");
	return 0;
}

时间: 2024-10-12 12:41:43

阿里巴巴笔试题--二叉树(知识复习与整理)的相关文章

计算机网络笔试题 详细分析复习知识点

1.在无盘工作站向服务器申请IP地址时,使用的是(     )协议. A.ARP B.RARP C.ICMP D.IGMP 解析: ARP工作机制 : A的ARP表中没有B的IP MAC 对应条目则发送ARP广播包,请求B的MAC地址 在全网"呼叫" 当B听到有机器"嚎叫"就返回一个数据包告诉你"我的MAC是X"然后双方就可以通信了,在A"嚎叫"的时候,A需要把IP和MAC地址广播出去用于B返回信息, 之后AB更新自己的ARP

阿里巴巴笔试题集第23题及分析

题目: 一个骰子, 6 面, 1 个面是 1 , 2 个面是 2 , 3 个面是 3 , 问平均掷多少次能使 1 . 2 . 3 都至少出现一次. ?方法: 面对面试概率题几乎屡试不爽的分叉树递归列方程法. ?这是一个求数学期望的问题,最终是求 1 , 2 , 3 出现至少一次的最短长度的期望. ?这样分叉树的每个节点是一个期望状态,而每个分叉是一次投掷结果.将后续期望出现 1 . 2 . 3 各至少一次的情形记作 L 123 (即题目所求),将后续期望出现 1 . 2 各至少一次( 3 无关)

阿里巴巴笔试题

附加题(三选一) 1.      案例一 1)     案例说明:2012年11月11日,天猫及淘宝创造了191亿元的单日总成交额:2013年的“双11”,天猫及淘宝的总成交额达到350.19亿元,成为全球最大购物狂欢节.如今,便捷丰富的购物体验吸引着越来越多的网购消费者,同时,越来越多的中小企业.小卖家等活跃在阿里巴巴平台上,竞争随之越来越激烈,如何解读大数据.用好大数据进行精细化.精准化运营?已然成为炙手可热的话题!如果,你拥有阿里巴巴的电商大数据,如果,你面向的是千万级的商家和数以亿级的买

2016阿里巴巴笔试题

昨天刚刚考完阿里的秋季校招笔试.40分钟单选和60分钟开放题,选择题50%以上为数学题.还涉及到了操作系统,算法.整理例如以下: 选择题: (1)下列语句中描写叙述最正确的是____. Linux 的线程同步方式有:临界区,内核对象,相互排斥量,条件变量 Linux 的线程同步方式有:临界区,内核对象,相互排斥量,信号量 Linux 的线程同步方式有:临界区,内核对象,条件变量,信号量 Linux 的线程同步方式有:相互排斥锁,内核对象,条件变量,信号量 Linux 的线程同步方式有:相互排斥锁

2015-4-2的阿里巴巴笔试题:乱序的序列保序输出(bit数组实现hash)

分布式系统中的RPC请求经常出现乱序的情况.写一个算法来将一个乱序的序列保序输出.例如,假设起始序号是1,对于(1, 2, 5, 8, 10, 4, 3, 6, 9, 7)这个序列,输出是:123, 4, 567, 8, 9, 10 上述例子中,3到来的时候会发现4,5已经在了.因此将已经满足顺序的整个序列(3, 4, 5)输出为一行. 1 #include<stdio.h> 2 3 int main() 4 { 5 int num ; 6 while(scanf("%d"

关于 阿里巴巴笔试题 :投资保险的 建议

/** * * @author xy1131975903 * 1)应该将保险类设计为资源共享,即设计一个同步方法用于控制用户的投资:推断是否投资成功: * 2)应将投资者设计为多线程类,即实现Runnable接口,能够竞争投资. * 3)须要在投资者中体现,竞争投资资源(保险类)的属性,即能够设计保险类为其成员变量. * 这样就能够体现多个用户竞争投资资源的实现. * */ class Insurance{ private double yield=0.18; private int total

阿里巴巴笔试题求最小三元组距离

已知三个升序整数数组a[l], b[m]和c[n].请在三个数组中各找一个元素,是的组成的三元组距离最小.三元组的距离定义是:假设a[i].b[j]和c[k]是一个三元组,那么距离为: Distance = max(|a[ I ] – b[ j ]|, |a[ I ] – c[ k ]|, |b[ j ] – c[ k ]|) 请设计一个求最小三元组距离的最优算法,并分析时间复杂度. #include<iostream> using namespace std; int Max(int a,i

嵌入式c笔试题(整理)

嵌入式c笔试题 (2012-03-24 22:36) 预处理器(Preprocessor)1. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL我在这想看到几件事情:1). #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等)2). 懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的

2014.3.29阿里巴巴暑期实习笔试题分析

参考:http://blog.csdn.net/iloveyoujelly/article/details/22941531 下面中的[分析]是我给出的. 2014.3.29阿里巴巴暑期实习笔试题分析 一.单选 1.假设一个主机ip为192.168.5.121,子网掩码为255.255.255.248,则该主机的网络号部分(包括子网号部分)为-- A.192.168.5.12  B 192.168.5.121   C 192.168.5.120   D 192.168.5.32 参考答案 C [