二叉樹相關問題

2021-08-02 14:42:29 字數 1617 閱讀 1912

樹的基本概念:

樹的度:樹中所有節點中最大的度;

節點的層數:節點的層數從樹根開始計算,根節點是第一層,依次向下為第2.3.,,,n層,

樹的深度:樹中節點的最大層數稱為樹的深度。

完全二叉樹:二叉樹中除最後一層外,其他各層的節點數都達到最大個數,且最後一層葉節點按照從左向右的順序連續存在,只缺最後一層右側若干節點。

滿二叉樹一定是完全二叉樹,而完全二叉樹不一定格式滿二叉樹。

二叉樹的順序儲存:

採用一維結構陣列來表示,如果是完全二叉樹的話,直接進行儲存就可以;

但是如果是非完全二叉樹,則必須補全二叉樹成為完全二叉樹(用#等符號),然後進行順序儲存,否則的話就不能按照下面的規則來推算節點之間的關係:

節點i,父親節點為(i-1)/2,子節點為2*i+1   2*i+2。

順序儲存的缺點就是浪費空間,因為其中可能填充了大量無用的資料,比如上面的#。所以一般只適用於完全二叉樹;

二叉樹的鏈式儲存:

採用結構體型別,結構體中包括左子樹節點指標、右子樹節點指標、元素資料以及父節點指標。

初始化二叉樹:

就是初始化二叉樹的根,包括申請節點空間,為節點中的元素賦值 ,左右子樹均為空就可以了。

查詢節點、計算二叉樹的深度、清空二叉樹(通常free(treenode)之後還會treenode=null,這樣不僅指標所指向的空間被釋放了,這個指標也被賦值成為空指標,否則這個指標就成為了野指標)都可以用遞迴的方式!!!

二叉樹的遍歷:

按層遍歷二叉樹,一般不能使用遞迴演算法,而是使用給乙個迴圈佇列進行處理;

先序遍歷、中序遍歷以及後序遍歷可以採用遞迴的思想。

二叉樹按層遍歷:

1.針對二叉樹的寬度優先遍歷。

2. 寬度優先遍歷常使用佇列結構。

3. 還要列印出行號。

思路:

last表示正在列印的當前行的最右節點

nlast表示下一行的最右節點

二叉樹的序列化和反序列化:

將二叉樹記錄成檔案的過程叫做二叉樹的序列化,又叫二叉樹的持久化過程;

把檔案中的記錄還原成二叉樹的過程叫做二叉樹的反序列化過程。

序列化的方式:

根據先序遍歷序列化;

根據中序遍歷序列化;

根據後序遍歷序列化;

按層序列化;

用乙個特殊字元表示乙個二叉樹節點值的結束的意義:防止出現歧義

先序遍歷對二叉樹進行序列化:

1. 假設序列化結果為str,初始時str為空字串;

2.先序遍歷二叉樹時如果遇到空節點,在str末尾加上「#!」

3. 如果遇到不為空的節點,假設節點值為3,就在str的末尾加上「3!」

一棵二叉樹通過先序遍歷得到的結果,如何進行反序列化:

先將str轉換成字串型別的陣列,代表二叉樹先序遍歷的節點順序

1.選擇用什麼遍歷方式序列化,就選擇用什麼方式反序列化

2.一棵樹序列化的結果是唯一的,唯一的結果生成的二叉樹也是唯一的。

按層遍歷的方式對二叉樹進行序列化:

1. 用佇列來進行二叉樹的按層遍歷,即寬度優先遍歷

2.除了訪問節點的順序是按層遍歷之外,對結果字串的處理,與之前介紹的處理方式一樣

3. 反序列化過程同理

二叉樹的深度和高度問題,請檢視部落格

二叉樹相關問題

前序,中序非遞迴比較容易 前序 先一直壓左孩子,每次壓棧的時候就列印,沒有左孩子可壓,就出棧,同時把右孩子壓棧,繼續一直壓左孩子 中序 先一直壓左孩子,沒有左孩子可壓,就出棧,出棧的時候列印,同時把右孩子壓棧,繼續一直壓左孩子 而後續因為要把左右孩子都遍歷完了才能列印當前節點node,而又不能通過n...

二叉樹 相關問題

二叉樹的映象 反轉二叉樹 void minerro btnode ps if ps rightchild null int main else if p parent null s sp return s 對稱二叉樹 判斷一顆二叉樹和它的映象是否相同 即判斷一顆二叉樹自身是否對稱 bool iseq...

leetcode 二叉樹相關問題

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。輸入兩棵二叉樹a,b,判斷b是不是a的子結構。ps 我們約定空樹不是任意乙個樹的子結構 public class treenode ...