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.youkuaiyun.com/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.youkuaiyun.com/chan15/article/details/48738125
12.1-5 因为在基于比较的排序模型中,完成 n 个元素的排序,其最坏情况下需要 Ω( nlgn ) 时间。试证明:任何基于比较的算法从 n 个元素的任意序列中构造一棵二叉搜索树,其最坏情况下需要 Ω( nlgn ) 的时间。
ANSWER:
反证法:假设构造一棵二叉搜索树的最坏情况的时间 T( n ) < c1nlgn,而中序遍历二叉搜索树只需要 Θ( n ) 的时间,所以通过构造二叉搜索树的比较排序时间为 T( n ) + O( n ) < c2nlgn,与基于排序模型中,n 个元素的排序最坏情况的 Ω( nlgn ) 时间矛盾。假设不成立。得证