给定一个有序数组(递增),构建一棵具有最小高度的二叉树
2015-08-05 16:55
495 查看
给定一个有序数组(递增),写程序构建一棵具有最小高度的二叉树。
想要使构建出来的二叉树高度最小,那么对于任意结点, 它的左子树和右子树的结点数量应该相当。比如,当我们将一个数放在根结点, 那么理想情况是,我们把数组中剩下的数对半分,一半放在根结点的左子树, 另一半放在根结点的右子树。我们可以定义不同的规则来决定这些数怎样对半分, 不过最简单的方法就是取得有序数组中中间那个数,然后把小于它的放在它的左子树, 大于它的放在它的右子树。不断地递归操作即可构造这样一棵最小高度二叉树。
#include <iostream> #include <cstring> #include <cmath> using namespace std; const int maxn = 100; struct Node{ int key; Node *lchild, *rchild, *parent; }; Node *p, node[maxn]; int cnt; void init(){ p = NULL; memset(node, '\0', sizeof(node)); cnt = 0; } void create_minimal_tree(Node* &head, Node *parent, int a[], int start, int end){ if(start <= end){ int mid = (start + end)>>1; node[cnt].key = a[mid]; node[cnt].parent = parent; head = &node[cnt++]; create_minimal_tree(head->lchild, head, a, start, mid-1); create_minimal_tree(head->rchild, head, a, mid+1, end); } } int height(Node *head){ if(head == NULL) return 0; return max(height(head->lchild), height(head->rchild)) + 1; } int main(){ init(); int a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8 }; Node *head = NULL; create_minimal_tree(head, NULL, a, 0, 8); cout<<height(head)<<endl; return 0; }
相关文章推荐
- POJ2976 Dropping tests (分数规划)
- 文件上传, 打开, 删除操作
- Android(java)学习笔记141:SQLiteDatabase的query方法参数分析
- 解决Popmetal板上I2C挂载额驱动不正常,含陀螺仪、重力传感器
- C++Primer新笔记之----第6章函数
- 正则表达式 验证YYYY-MM-DD HH:mm:ss,包含闰年验证(包含世纪年和普通闰年)
- C++Primer新笔记之----第10章泛型算法
- 字符串替换
- C++Primer新笔记之----第11章 使用关联容器
- [PyQt] 自定义QSlider支持鼠标点击和滚轮事件
- python format 大全
- CPN神经网络学习
- Target runtime Apache Tomcat v7.0 is not defined.
- 概念:CGI,FastCGI,PHP-CGI与PHP-FPM
- php异常处理
- git合并分支 注意事项
- 仿 UIAlertView 弹出动画效果
- FMDB读取Datetime类型值为1970的问题
- Meta标签中的format-detection属性及含义
- android 自动启动应用程序