不用二叉堆而是用含有指標域的節點構造線段樹的話,其所需節點個數與區間長度n的關係是什麼呢?
遞推公式
記f(x)表示根節點區間長度為x的線段樹的節點個數, 那麼有:
/ 2f(x/2) + 1, 當x>1且x為偶數時;
f(x) = | f((x+1)/2) + f((x-1)/2) + 1, 當x>1且x為奇數時;
\ 1, 當x=1時。
這條遞推公式與區間劃分的遞迴步驟有相似之處。
通項公式
前4項的結果
x 1 2 3 4 ...
f(x) 1 3 5 7 ...
猜測:
f(x) = 2x - 1
神奇,原先的遞推公式描述的竟然是奇數!
證明:定理:「對任何一棵二叉樹t,如果其終端結點數為n0,度為2的結點數為n2,則n0=n2+1。」
由於線段樹對區間作劃分時總是分割成左右兩個子區間,因此線段樹里只有度為0和度為2的節點。而最終是分割至區間長度為1的葉子節點,因此所有葉子節點個數之和為根節點區間n。
n0 = n; n2 = n0 - 1; 總節點個數= n0 + n2 = 2n - 1;
原來如此。
定理n0=n2+1的證明
設二叉樹總節點數目為n,有
n=n0+n1+n2——(公式1)
二叉樹度數總和為 0*n0+1*n1+2*n2;
而由二叉樹的圖形可以看出除根節點外,每個結點上方對應著乙個度(為更形象,可以理解成結點自己的頭上有一根「繩子」掛著自己)(可驗證當僅有根節點時也滿足這個規律),所以結點總數比度數多1,則有
n=n1+2*+1——(公式2)
公式1代入公式2即可得出:
n0=n2+1
第10周 專案3 (1)計算二叉樹節點個數
1.標頭檔案 btree.h,包含定義順序表資料結構的 巨集定義 要實現演算法的函式的宣告 define maxsize 100 typedef char elemtype typedef struct node btnode void createbtnode btnode b,char str ...
第10周 專案3 計算二叉樹節點個數
問題及描述 1.標頭檔案 btree.h,包含定義順序表資料結構的 巨集定義 要實現演算法的函式的宣告 define maxsize 100 typedef char elemtype typedef struct node btnode void createbtnode btnode b,cha...
第十周專案3 計算二叉樹節點個數
檔名稱 二叉樹.cpp 完成日期 2015年11月18日 版本號 vc 6.0 問題描述 二叉樹解決問題 輸入描述 無 程式輸出 二叉樹節點數 ifndef btree h included define btree h included define maxsize 100 typedef cha...