算法导论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 ) 时间矛盾。假设不成立。得证

0 0
原创粉丝点击