UOJ 572 完全二叉排序樹

2022-08-26 07:45:10 字數 1162 閱讀 7081

二叉排序樹或者是一棵空樹,或者是具有下列性質的二叉樹:

(1)若左子樹不空,則左子樹上所有結點的值均小於它的根結點的值;

(2)若右子樹不空,則右子樹上所有結點的值均大於它的根結點的值;

(3)左、右子樹也分別為二叉排序樹;

(4)沒有鍵值相等的結點。

完全二叉樹:只有最下面的兩層結點度能夠小於2,並且最下面一層的結點都集中在該層最左邊的若干位置的二叉樹。

給出n個數,且這n個數構成1至n的排列。現在需要你按順序構建一棵二叉排序樹,並按照層次遍歷的方式輸出它,然後判斷它是否是一棵完全二叉樹。

輸入包含兩行。第一行為乙個正整數n;第二行為1至n的排列。

輸出包含兩行。第一行為構建出的二叉排序樹的層次遍歷;第二行判斷是否是完全二叉樹:若是輸出yes,否則輸出no。

10

7 9 8 4 6 2 10 1 5 3

7 4 9 2 6 8 10 1 3 5

yes

5

3 4 5 2 1

3 2 4 1 5

no

樣例1:/

樣例2:/

對於100%的資料,1≤n≤20

先認為第乙個讀入的數是樹的根,然後每讀入乙個數,依次與已經存在的節點進行比較(見build函式);

然後從第乙個節點掃瞄,如果有是0的節點輸出no;

**:

#include#include#include#include#includeusing namespace std;

const int n=1000010;

bool flag;

int tree[n];

int n,num,ma;

void build(int jd)

}else

} }ma=max(ma,tot);

}int main()

build(num);

} for(int i=1; i<=ma; i++)

printf("\n");

if(!flag)

printf("yes\n");

else

printf("no\n");

return 0;

}

572 完全二叉排序樹

題面 哼,這個題目真的很簡單啊。原諒我最開始把題面看錯了。實際上就是呢以第乙個點為樹根結點,然後將每個讀進來的結點比對並插入樹中。唯一的問題呢,就是陣列大小的問題。md。陣列開100的話只有90分。所以,自重嘍 1 include2 include3 include4 include5 includ...

二叉排序樹

在複習資料結構,把這個東西總結一下。這種結構是動態查詢表,這種動態是相對靜態查詢 順序查詢,折半查詢,分塊查詢等 來說的。對於各種靜態鍊錶,要達到查詢複雜度為o logn 必須要求有序 而要使插入刪除複雜度為o 1 必須是鍊錶儲存。動態查詢表就可以同時滿足這兩者。動態查詢表的特點是表結構本身在查詢過...

二叉排序樹

name 二叉排序樹相關操作 author unimen date 2011 10 8 13 14 21 刪除結點比較麻煩,總結如下 4大種情況 1 結點p無右孩子 將該點的左孩子變為其在雙親中的同位孩子 1 p為其雙親的左孩子時將其的左孩子變為雙親的左孩子 2 p為其雙親的右孩子時將其的左孩子變為...