算法导论12.1什么是二叉搜索树 练习总结
来源:互联网 发布:如何美化java做的界面 编辑:程序博客网 时间:2024/05/21 17:44
12.1-1 对于关键字集合 { 1,4,5,10,16,17,21 },分别画出高度为2、3、4、5 和 6 的二叉搜索树。
ANSWER:
12.1-2 二叉搜索树性质与最小堆性质(见 6.1 节)之间有什么不同?能使用最小堆性质在 O( n ) 时间内按序输出一颗有 n 个结点的关键字吗?可以的话,请说明如何做,否则解释理由。
ANSWER:
① 最小堆只是根结点比儿子的关键字小,不能直接通过遍历得到排序结果。二叉搜索树可以通过中序遍历得到升序排序。
② 不能在 O( n ) 时间内按序输出,因为最小堆提取根结点后需要用 O( lgn ) 时间维持最小堆的性质。而且基于比较的排序算法下限 O( nlgn )。
12.1-3 设计一个执行中序遍历的非递归算法。(提示:一种容易的方法是使用栈作为辅助数据结构;另一种较复杂但比较简洁的做法是不使用栈,但要假设能测试两个指针是否相等。)
ANSWER:
void inorder(TreeNode *root) { TreeNode *x = root; vector<TreeNode *> p; while(x != NULL || p.size() != 0){ while(x != NULL){ p.push_back(x); x = x->left; } x = p.back(); p.pop_back(); cout << x->val << endl; x = x->right; }}更多关于遍历问题请看:http://blog.csdn.net/chan15/article/details/48738125
12.1-4 对于一课有 n 个结点的树,请设计在 Θ( n ) 时间内完成的先序遍历算法和后序遍历算法。
ANSWER:
void inorder(TreeNode *root){ if (root != NULL){ inorder(root->left); cout << root->val << endl; inorder(root->right); }}
void postorder (TreeNode *root){ if (root != NULL){ postorder (root->left); postorder (root->right); cout << root->val << endl; }}更多关于遍历问题请看:http://blog.csdn.net/chan15/article/details/48738125
12.1-5 因为在基于比较的排序模型中,完成 n 个元素的排序,其最坏情况下需要 Ω( nlgn ) 时间。试证明:任何基于比较的算法从 n 个元素的任意序列中构造一棵二叉搜索树,其最坏情况下需要 Ω( nlgn ) 的时间。
ANSWER:
反证法:假设构造一棵二叉搜索树的最坏情况的时间 T( n ) < c1nlgn,而中序遍历二叉搜索树只需要 Θ( n ) 的时间,所以通过构造二叉搜索树的比较排序时间为 T( n ) + O( n ) < c2nlgn,与基于排序模型中,n 个元素的排序最坏情况的 Ω( nlgn ) 时间矛盾。假设不成立。得证
- 算法导论12.1什么是二叉搜索树 练习总结
- 算法导论12.2查询二叉搜索树 练习总结
- 算法导论12.4随机构建二叉搜索树 练习总结
- 算法导论程序27-什么是二叉搜索树
- 算法导论(Introduction to Algorithms )— 第十二章 二叉搜索树— 12.1 什么是二叉搜索树
- 算法导论-----二叉搜索树
- 算法导论-----------二叉搜索树
- 算法导论 二叉搜索树
- 算法导论--二叉搜索树
- 【算法导论】二叉搜索树
- 算法导论二叉搜索树
- 算法导论 二叉搜索树
- 算法导论二叉搜索树
- 算法导论 二叉搜索树
- 算法导论12章二叉搜索树 思考题总结
- [算法导论]第十二章《二叉搜索树》
- 【算法导论】最优二叉搜索树
- 二叉搜索树(算法导论)
- sizeof的应用
- iframe获取父、子窗口的方法
- 透明Textbox的简单实现!
- android中使用隐藏类的方法
- maven POM.xml 开发配置标签详解
- 算法导论12.1什么是二叉搜索树 练习总结
- 抽象类
- discuzX2.5 源码模板简介
- js实现图片上传预览
- LeetCode-Move Zeroes
- 关于自增自减运算符的一些问题
- 4.1链表二叉树
- ggplot2学习笔记之构建图层
- 设计模式——三工厂模式