給定乙個序列,要求將其構造成完全平衡二叉樹,然後輸出其中序遍歷結果
完全二叉樹指的是任乙個有右子樹的結點必須有左子樹,從層序遍歷的角度來說,他不會在遍歷過程中遇到空節點
若用陣列存放,可知,乙個下標為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 層所有的結點都連續集中在最左邊,這就是完全二叉樹。三 平衡...