求二叉樹的帶權路徑長度問題

2021-09-24 21:45:35 字數 1361 閱讀 2663

問題解決方法

個人總結

二叉樹是n(n>=0)個節點的有限集合:

1 或者為空二叉樹,即n=0

2 或者由乙個根結點和兩個互不相交的的被稱為根的左子樹和根的右子樹組成。其中左子樹和右子樹又分別是乙個二叉樹。

二叉樹的帶權路徑長度為每個葉子結點的深度與權值之積的總和。
先序遍歷的時候需要採用遞迴呼叫來進行二叉樹的遍歷,把每個結點的深度作為遞迴函式的乙個引數進行傳遞.具體步驟如下:

若當前訪問結點是葉結點,則總長度加上該結點的深度與權值之積

若該結點是非葉結點,若左子樹不為空,遞迴呼叫左子樹,若右子樹不為空,遞迴呼叫右子樹,直至最後返回總長度

二叉樹結點的資料型別定義如下:

typedef struct binodebinode,

*bitree;

int  pre_weight

(bitree root,int deep)

if(root-

>lchild !=

null)if

(root-

>rchild !=

null

)return sum;

}

層次遍歷的時候需要使用佇列進行遍歷,並記錄當前的層數,具體步驟如下:

當遍歷到葉結點時候,總長度加上該結點的深度與權值之積。

當遍歷到非葉結點的時候,把該結點的子樹加入到佇列,當某結點為該層最後乙個結點的時候,層數加一,隊列為空的時候就返回總長度

二叉樹結點的資料型別定義如下:

typedef struct binodebinode,

*bitree;

層次遍歷**

#define maxsize 10000

//佇列長度是情況而定

int sum_levelorder

(bitree root)

if(t-

>lchild !=

null)if

(t->rchild !=

null)if

(t==currentnode)

}return sum;

}

1 遞迴先序遍歷的時候需要設定static關鍵字,來保證整個程式執行期間,總長度一直存在

2 層次遍歷的時候要抓住當前層的最後乙個結點和下一層的最後的乙個結點,作為層次遍歷改變的臨界情況

3 層次遍歷的時候涉及到迴圈,需要注意佇列的隊尾,隊首指標的定義,涉及臨界條件.需要注意

求二叉樹的帶權路徑WPL

求二叉樹的帶權路徑wpl,wpl是二叉樹所有葉節點與深度乘積之和 include include using namespace std typedef struct btnodebtnode 二叉樹樣式 6 3 8 2 4 7 9 建立二叉樹 bool create btnode t,char x...

Huffman樹的帶權路徑長度

題目描述 給定n個權值 權值均是大於0的正整數 構造赫夫曼樹ht,並求出赫夫曼樹ht的帶權路徑長度。注意 構造赫夫曼樹ht時,在將2棵二叉樹合併成一棵新的二叉樹時,將根結點權值小的用作左子樹!輸入先輸入權值的個數n n 1 然後依次輸入n個權值 權值均是大於0的正整數 輸出輸出構造的赫夫曼樹ht的帶...

求二叉樹的路徑和

給定乙個二叉樹,找出所有路徑中各節點相加總和。乙個有效的路徑,指的是從根節點到葉節點的路徑。這樣就是一條有效的路徑,求這個路徑上值的和,以及對應路徑上的值.當用前序遍歷的方式訪問到某一結點時,我們把該結點新增到路徑 陣列或棧中 上,並累加該結點的值。如果該結點為葉結點,路徑結束,我們把它列印出來。如...