CLRS 12.1什麼是二叉搜索樹

12.1-1
這裏寫圖片描述

12.1-2
二叉搜索樹某一結點關鍵字大於等於它的左孩子關鍵字而小於等於它右孩子的關鍵字,最小堆則是某一結點關鍵字小於等於它左右孩子結點的關鍵字。
不能在 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的說法有點類似,若基於比較的算法能夠在少於 nlgn 時間構造一棵二叉搜索樹,由於二叉搜索樹能在 O(n) 的時間將元素按序輸出,則基於比較的算法能夠在少於 nlgn 時間排序,顯然不可能,因此最少需要 Ω(nlgn) 時間。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章