将一个数组转换成深度最低的二叉树

问题定义:

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

思路:

       这题还是比较简单的,从已排序的数组和高度最低的二叉树这两个关键词中就可以得到一些启发,类似与二分查找,将最中间的元素作为根节点,左边的元素插入到左子树,右边的元素插入到右子树即可,最后实现了一个二叉查找树。

代码如下:

  1. #include <algorithm>  
  2. #include <stdio.h>  
  3. #include <time.h>  
  4.   
  5. struct node   
  6. {  
  7.         int data;  
  8.         struct node * lchild;  
  9.         struct node * rchild;  
  10. };  
  11.   
  12. //将数组转换为深度最低的二叉树,采用了二分查找的思想  
  13. struct node* ConvertArrayToTree(int data[], int first, int last)  
  14. {  
  15.         if (last < first)   
  16.         {  
  17.                 return NULL;  
  18.         }  
  19.         else  
  20.         {  
  21.                 int mid = ( last + first ) / 2;  
  22.                 struct node * newNode = NULL;  
  23.                 newNode = (struct node *)malloc(sizeof(struct node));  
  24. //Malloc 向系统申请分配指定size个字节的内存空间。返回类型是 void* 类型。void* 表示未确定类型的指针
  25.                 newNode->data = data[mid];  
  26.                 newNode->lchild = ConvertArrayToTree(data, first, mid - 1);  
  27.                 newNode->rchild = ConvertArrayToTree(data, mid + 1, last);  
  28.                 return newNode;  
  29.         }  
  30. }  
  31.   
  32. //中序遍历  http://baike.baidu.com/view/1455143.htm

  33. void Traverse(struct node *root)  
  34. {  
  35.         if (root == NULL)   
  36.         {  
  37.                 return;  
  38.         }  
  39.         Traverse(root->lchild);  
  40.         printf("%d\t", root->data);  
  41.         Traverse(root->rchild);  
  42.           
  43. }  
  44. int main(int argc, char* argv[])  
  45. {  
  46.         const int SIZE = 100;  
  47.         int data[SIZE];  
  48.         int i, j;  
  49.         int flag = 1;  
  50.         struct node *head = NULL;  
  51.         srand(time(0));  
  52.         for (i = 0; i < SIZE; i++)   
  53.         {  
  54.                 data[i] = rand() % SIZE;  
  55.                 flag *= -1;  
  56.                 data[i] *= flag;  
  57.         }  
  58.   
  59.         std::sort(data, data + SIZE);  
  60.         for (i = 0; i < SIZE; i++)   
  61.         {  
  62.                 printf("%d\t", data[i]);  
  63.         }  
  64.         printf("\n");  
  65.   
  66.         head = ConvertArrayToTree(data, 0, SIZE - 1);  
  67.         Traverse(head);  
  68.         printf("\n");  
  69.   
  70.         return 0;  
  71. }  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值