PAT 1064 完全二叉樹和平衡二叉樹

2021-10-05 01:11:16 字數 986 閱讀 2993

給定乙個序列,要求將其構造成完全平衡二叉樹,然後輸出其中序遍歷結果

完全二叉樹指的是任乙個有右子樹的結點必須有左子樹,從層序遍歷的角度來說,他不會在遍歷過程中遇到空節點

若用陣列存放,可知,乙個下標為root的結點,他的左子樹下標一定是2 * root,右子樹下標一定是2 * root + 1

陣列存放節點的順序正好是其層序遍歷順序

任意乙個節點的左孩子一定小於自身資料域,右孩子一定大於自身資料域

平衡二叉樹的中序遍歷的結果是從小到大有序的

有了上述描述,我們可以利用靜態陣列來儲存樹結構

將資料讀入,然後對資料進行排序,則這個排序順序就是完全平衡二叉樹的中序遍歷結果

中序遍歷這個靜態陣列樹,從根節點1開始(根節點不能是下標0,否則0 * x都是0了),利用中序遍歷的性質,只不過將中序第二步的列印變成賦值,本質上是一樣的。

#include

#include

using

namespace std;

const

int maxn =

2001

;int bst[

2001];

int n;

int temp[

2001];

int index =0;

void

inorder

(int root)

intmain()

sort

(temp, temp + n)

;inorder(1

);for(

int i =

1; i <= n; i++

)return0;

}

如果將整個樹重構,然後建立乙個完全平衡二叉樹就太麻煩了,因為完全二叉樹最好的性質就是下標的關係,不用這個性質的話就太可惜了

不要太死板的理解中序遍歷,中序遍歷這個過程其實就是中序的去獲得和使用結點的方法,可以用在很多地方

二叉樹深度和平衡二叉樹的判定

對於二叉樹的深度的求解,利用遞迴的方式求解很簡單 下面就來設計這個遞迴演算法 要求乙個節點的高度,先求左子樹的高度,然後再求解右子樹的高度。最後樹的高度就是1 max left depth,right depth int leftlen depth tree root left int rightl...

滿二叉樹 完全二叉樹 平衡二叉樹 最優二叉樹

一棵二叉樹的結點要麼是葉子結點,要麼它有兩個子結點 如果乙個二叉樹的層數為k,且結點總數是 2k 12 k 1 2k 1 則它就是滿二叉樹。若設二叉樹的深度為k,除第 k 層外,其它各層 1 k 1 的結點數都達到最大個數,第k 層所有的結點都連續集中在最左邊,這就是完全二叉樹。它或者是一顆空樹,或...

滿二叉樹 完全二叉樹 平衡二叉樹 最優二叉樹

一 滿二叉樹 一棵二叉樹的結點要麼是葉子結點,要麼它有兩個子結點 如果乙個二叉樹的層數為k,且結點總數是 2 k 1,則它就是滿二叉樹。二 完全二叉樹 若設二叉樹的深度為k,除第 k 層外,其它各層 1 k 1 的結點數都達到最大個數,第k 層所有的結點都連續集中在最左邊,這就是完全二叉樹。三 平衡...