CLRS 12.1什么是二叉搜索树
2015-12-25 14:05
176 查看
12.1-1
12.1-2
二叉搜索树某一结点关键字大于等于它的左孩子关键字而小于等于它右孩子的关键字,最小堆则是某一结点关键字小于等于它左右孩子结点的关键字。
不能在 O(n)O(n) 的时间按顺序输出,如果可以的话,我们只需要 O(n)O(n) 的时间建堆,然后 O(n)O(n) 的时间输出排序结果,显然我们只用 O(n)O(n) 的时间就可以完成堆排序,这和事实违背。
12.1-3
非递归排序在前面的第十章第四节有出现过,我就简单的复制前面的代码不做解释。
12.1-4
和二叉搜索树差不多,先序就是输出根的关键字在其子树(子树从左到右依次输出)之前,后序就是输出根的关键字在其子树(子树从左到右依次输出)之后。
12.1-5
和12.1-2的说法有点类似,若基于比较的算法能够在少于 nlgnn\lg n 时间构造一棵二叉搜索树,由于二叉搜索树能在 O(n)O(n) 的时间将元素按序输出,则基于比较的算法能够在少于 nlgnn\lg n 时间排序,显然不可能,因此最少需要 Ω(nlgn)\Omega (n\lg n) 时间。
12.1-2
二叉搜索树某一结点关键字大于等于它的左孩子关键字而小于等于它右孩子的关键字,最小堆则是某一结点关键字小于等于它左右孩子结点的关键字。
不能在 O(n)O(n) 的时间按顺序输出,如果可以的话,我们只需要 O(n)O(n) 的时间建堆,然后 O(n)O(n) 的时间输出排序结果,显然我们只用 O(n)O(n) 的时间就可以完成堆排序,这和事实违背。
12.1-3
非递归排序在前面的第十章第四节有出现过,我就简单的复制前面的代码不做解释。
#include <iostream> #include <stack> using std::cout; using std::endl; using std::stack; struct binTree { int key; binTree *left; binTree *right; }; void inorder(binTree *root) //中序遍历 { if(root != NULL) { inorder(root->left); cout << root->key << ' '; inorder(root->right); } } void non_recursive_inorder(binTree *root) { stack<binTree *> ptr; binTree *p = root; while(p || !ptr.empty()) { while(p) //一直找到最左孩子 { ptr.push(p); p = p->left; } if(!ptr.empty()) //出栈,然后向右子树走 { p = ptr.top(); cout << p->key << ' '; ptr.pop(); p = p->right; } } }
12.1-4
和二叉搜索树差不多,先序就是输出根的关键字在其子树(子树从左到右依次输出)之前,后序就是输出根的关键字在其子树(子树从左到右依次输出)之后。
12.1-5
和12.1-2的说法有点类似,若基于比较的算法能够在少于 nlgnn\lg n 时间构造一棵二叉搜索树,由于二叉搜索树能在 O(n)O(n) 的时间将元素按序输出,则基于比较的算法能够在少于 nlgnn\lg n 时间排序,显然不可能,因此最少需要 Ω(nlgn)\Omega (n\lg n) 时间。
相关文章推荐
- iOS---如何把导航默认的返回按钮设置成“返回”
- Python基础教程 正则表达式 学习笔记
- 免费APP在线測试工具以及其用法
- C#后台对javascript的escape()方法编码后的字符进行解码
- 《循序渐进Linux》第二版即将出版发行(附封面)
- 《循序渐进Linux》第二版即将出版发行(附封面)
- 什么是DTO?
- 进程监控工具supervisor 启动Mongodb
- 在Apache+mod_wsgi+python的基础上搭建https安全访问
- Python编程(二):Python进程、线程的那点事儿
- 行为型:设计模式之访问者模式(二十三)
- 用流域和最佳的阈值进行慢性淋巴细胞性白血病细胞分割
- Java程序员之JS(一) 入门
- 小记录
- 嵌入式Linux学习-----u-boot移植
- iOS_字符串显示不同颜色
- socket小实例
- Android 图片Exif信息相关的获取与修改
- Activity Task
- 用OKR制定目标