劍指offer 與二叉樹結構相關的習題練習

2021-10-05 19:08:36 字數 3000 閱讀 4003

二、二叉搜尋樹

1、題目要求

請完成乙個函式,輸入一顆二叉樹,該函式輸出它的映象。

2、題目分析

首先,我們要理解一下這個「映象」的含義到底是個什麼。具體的看下面這個例子。

這兩棵二叉樹就是互為映象的兩棵二叉樹。仔細觀察這兩棵樹我們就可以發現其中的規律,他們的根結點都是相同的,但是他們的左右兩個子結點交換了位置。其實映象的過程很簡單:先序遍歷這棵樹的每個結點,如果遍歷到的結點有子結點,則交換他的兩個子結點。當交換所有非葉結點的左右子結點之後就得到了樹的映象。具體的**實現如下:

void

mirrorrecursively

(binarytreenode* pnode)

1、題目描述請實現乙個函式,用來判斷一顆二叉樹是不是對稱的。如果一顆二叉樹和它的映象一樣,那麼他就是對稱的。

2、題目分析

首先我們得 明確一下什麼是對稱的二叉樹,就如下面的例子所示一樣

其中圖一是對稱的二叉樹,但是後面兩個圖都不是對稱的。我們仔細分析一下圖一對稱的二叉樹的特點,來得出問題的解。

一般的我們有三種不同的二叉樹遍歷的方式,分別為前序中序和後序,但是不管何種方式都是先遍歷左子樹再遍歷右子樹。如果我們用前序遍歷的方式遍歷圖一所示的樹,遍歷結果為。但是我們針對前序遍歷定義一種對稱的遍歷演算法,即先遍歷父節點,再遍歷他的右子結點最後才是左子結點。以這樣的方式遍歷圖一所示的二叉樹,遍歷結果還是。則證明這顆二叉樹為對稱的二叉樹。

值得注意的是,圖三這樣的二叉樹,兩種遍歷結果都是相同的,但是他並不是一顆對稱二叉樹,所以需要將nullptr也加入序列進行比較。

由此,可以總結出我們判定的方法:通過比較二叉樹的前序遍歷序列和對稱前序遍歷序列來判斷二叉樹是不是對稱的。如果兩個序列是一樣的,那麼二叉樹就是對稱的。

有了上述的分析,我們可以寫出**如下:

bool

issymnetrical

(binarytreenode* proot1, binarytreenode* proot2)

bool

issymnetrical

(binarytreenode* proot)

1、題目要求輸入一顆二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。比如下圖所示的這顆二叉搜尋樹轉換過後的雙向鍊錶如下圖所示:

2、題目分析

首先,我們知道的是要使二叉搜尋樹有序,則需要中序遍歷這顆二叉搜尋樹。其次我們可以發現二叉搜尋樹的結構其實和雙向鍊錶很相似,原先指向左子節點的指標調整為鍊錶中指向前乙個結點的指標,原先指向右子樹的指標調整為鍊錶中指向後乙個結點的指標。

最主要的是考慮如何轉換的問題,我們可以把樹分成3部分:根結點、左子樹和右子樹。然後把左子樹中最大的結點、根結點、右子樹中最小的結點鏈結起來,至於如何把左子樹和右子樹內部結點鏈結成煉表,那和原來的問題實質是一樣的,因此可以使用遞迴來解決。按照中序遍歷的順序,當我們遍歷轉換到根結點的時候他的左子樹已經轉換成乙個排序的鍊錶了,並且處在鍊錶中最後乙個結點就是當前最大的結點。具體的**實現如下:

binarytreenode*

convertnode

(binarytreenode* pnode, binarytreenode*

* plastnodeinlist)

binarytreenode*

convert

(binarytreenode* prootoftree)

1、題目分析請實現兩個函式,分別用來序列化和反序列化二叉樹

2、題目分析

首先,我們得明確一下相關概念,什麼是序列化又什麼是反序列化。簡單的來講,序列化就是根據前序遍歷的順序來序列化二叉樹。而反序列化就是根據序列化的結果來構造一顆樹。

在我們之前有提到過的「重建二叉樹」中,我們可以根據前序遍歷序列和中序遍歷序列構造出一顆二叉樹。但是這種方式還是存在兩個弊端,一是該方法要求二叉樹中不能有重複的結點,二是只有當兩個序列中所有所有資料都讀出來過後才能開始反序列化。

基於上述說法,我們可以用以下的方式來加以實現,為了方便,我們將nullptr指標序列化「$」,結點的數值之間要用乙個特殊字元『,』隔開。

序列化**實現如下:

void

serialize

(binarytreenode* proot, ostream& stream)

stream << proot-

>m_data <<

",";

serialize

(proot-

>leftchild, stream)

;serialize

(proot-

>rightchild, stream)

;}

反序列化**實現如下:

void

deserialize

(binarytreenode*

* proot, istream& stream)

}

注意,上述**都使用了c++中的輸入方法類和輸出方法類。允許雙向的輸入輸出操作。其中readstream每次從流中讀出乙個數字或者字元『$』.當從流中讀取的是數字時,函式返回true,否則返回false。

二叉樹 結構體

size large align center 二叉樹 結構體 align size 程式名稱 利用結構體建立二叉樹 written by hewei 2011 05 30 include using namespace std define max 20 定義儲存二叉樹節點的結構體 struct ...

平衡二叉樹結構

對二叉樹做深度優先遍歷,遞迴過程中 終止條件 當dfs越過葉子節點時候,返回高度0.返回數值 從低至上,返回每個節點root 為根節點的字數最大高度 左右字數的中最 當我們發現有乙個例子,左右子樹高度差 1的情況時,代表此樹不是平衡二叉樹。當發現不是平衡二叉樹時,後面的高度計算都沒有意義了,因此一路...

樹結構 二叉樹

二叉樹 如果書中的每個節點最多只有兩個子節點,這樣的樹就叫做二叉樹 1.二叉樹的重要特性 二叉樹第 i 層的最大節點數為 2 i 1 i 1 深度為 k 的二叉樹最大節點總數為 2 k 1 對於任何乙個非空二叉樹t,若n0表示葉節點的個數,n2為度為2的非空葉節點個數,那麼兩者滿足 n0 n2 1 ...