完全二叉搜尋樹是兩個概念的包含,即完全二叉樹+二叉搜尋樹。二叉搜尋樹是一棵二叉樹,以根結點為中心,根結點左子樹的所有結點權值均小於根結點的權值,根結點右子樹的所有結點權值均大於根結點的權值。
而完全二叉樹指從根結點到倒數第二層滿足完美二叉樹,最後一層可以不完全填充,其葉子結點都靠左對齊。
(完美二叉樹:又叫滿二叉樹,指乙個深度為k(>=-1)且有2^(k+1) - 1個結點的二叉樹稱為完美二叉樹。)
完全二叉樹:
完全二叉搜尋樹的要求是按照給定序列建出一棵完全二叉樹,同時這棵完全二叉樹滿足二叉搜尋樹的性質。舉個例子:把0123456789這個序列建一棵完全二叉搜尋樹,得到的樹應該是這個樣子的:
接下來是核心演算法的思路:首先我們可以把給定的序列從小到大排序,例如0123456789。然後我們想,我們最後建成的樹是滿足二叉搜尋樹的性質,即根結點左子樹的所有結點的權值均小於根結點的權值,根結點右子樹的所有結點的權值均大於根結點的權值,所以,如果我們知道這棵樹根結點的左子樹一共有n個結點,那麼就可以知道根結點的權值是從小到大排列完後序列中的第n+1位的數字。為什麼可以這樣做?因為這利用到了完全二叉樹的性質,當給定乙個確定的k(k是結點數),那麼這個完全二叉樹就是固定不變的了。比如棵樹:
0-9有是個數,也就是k=10;所以以此序列構建出的完全二叉搜尋樹根結點的左子樹一定含有6個結點。所以根結點的值就是序列中的第7位的數字(也就是「6」)。同時我們也就可以知道「6」之後的數7、8、9是右子樹的結點的值。
當我們填了第乙個數根結點的值6之後,就可以遞迴的處理左右子樹。因為如果一棵二叉樹是完全二叉樹的話,那麼它的左子樹和右子樹也一定是完全二叉樹。所以可以用遞迴處理。
例如填完根結點後,繼續看左子樹,根結點的左子樹一共有6個結點,一棵k=6的完全二叉樹的左子樹一定包含三個結點,所以左子樹的根節點的值填入「3」,同時知道該左子樹的右結點一定包含4和5這兩個結點。
核心演算法**在個人**雲:
是否完全二叉搜尋樹(資料結構 二叉搜尋樹)
題目 將一系列給定數字順序插入乙個初始為空的二叉搜尋樹 定義為左子樹鍵值大,右子樹鍵值小 你需要判斷最後的樹是否一棵完全二叉樹,並且給出其層序遍歷的結果。輸入格式 輸入第一行給出乙個不超過20的正整數n 第二行給出n個互不相同的正整數,其間以空格分隔。輸出格式 將輸入的n個正整數順序插入乙個初始為空...
7 3 是否完全二叉搜尋樹
將一系列給定數字順序插入乙個初始為空的二叉搜尋樹 定義為左子樹鍵值大,右子樹鍵值小 你需要判斷最後的樹是否一棵完全二叉樹,並且給出其層序遍歷的結果 include include include include include using namespace std struct node stru...
判斷完全二叉搜尋樹技巧
include using namespace std const int maxn 5e6 5 int tree maxn n void add int r,int v else if val tree r add r 2,val else add r 2 1,val int main int f...