【CareerCup】Trees and Graphs—Q4.3

转载请注明出处:http://blog.csdn.net/ns_code/article/details/24744177


    题目:

    Given a sorted (increasing order) array, write an algorithm to create a binary tree with minimal height.

    翻译:

    给定一个有序数组(递增),敲代码构建一棵具有最小高度的二叉树。

    思路:

    要使二叉树的高度最小,则要尽量使其左右子树的节点数目相当,自然就考虑到将其构造成为二叉排序树,且将有序数组的中间大的数作为根节点,这样得到的二叉树的高度便是最小的。

    实现代码:

#include<stdio.h>
#include<stdlib.h>
typedef struct BTNode
{
	int data;
	struct BTNode *pLchild;
	struct BTNode *pRchild;
}BTNode, *BTree;

/*
依据给定的递增数组递归创建高度最小的二叉树,
由于要改动指向根节点的指针的指向,因此要传入pTree的指针。即BTNode的二级指针
*/
void createBTree(BTree *ppTree,int *A,int start,int end)
{
	if(start <= end)
	{
		int mid = (start + end)/2;
		*ppTree = (BTree)malloc(sizeof(BTNode));
		if(*ppTree == NULL)
		{
			printf("malloc faild");
			exit(EXIT_FAILURE);
		}
		(*ppTree)->data = A[mid];
		(*ppTree)->pLchild = NULL;
		(*ppTree)->pRchild = NULL;
		createBTree(&(*ppTree)->pLchild,A,start,mid-1);
		createBTree(&(*ppTree)->pRchild,A,mid+1,end);
	}
}

/*
返回两个整数的最大值
*/
int max(int a,int b)
{
	return a>b?

a:b; } /* 求二叉树的深度 */ int height(BTree pTree) { if(pTree == NULL) return 0; else return max(height(pTree->pLchild),height(pTree->pRchild)) + 1; } /* 中序遍历的递归实现 */ void in_traverse(BTree pTree) { if(pTree) { if(pTree->pLchild) in_traverse(pTree->pLchild); printf("%d ",pTree->data); if(pTree->pRchild) in_traverse(pTree->pRchild); } } int main() { int A[] = {0,1,2,3,4,5,6,7}; int len = 8; BTree pTree; createBTree(&pTree,A,0,len-1); printf("the height of this tree is %d ",height(pTree)); printf("中序遍历后的结果为: "); in_traverse(pTree); printf(" "); return 0; }


    測试结果:


    注:代码开源到Github:https://github.com/mmc-maodun/CareerCup


原文地址:https://www.cnblogs.com/brucemengbm/p/7095448.html