二叉樹刷題系列( )

2021-10-09 17:55:12 字數 2127 閱讀 6697

本篇文章leetcode題目
刷二叉樹的題關鍵在於框架,本質上我們得摸清楚遍歷的情況。在做二叉樹的時候,重點考慮兩個方面。

第一,以什麼順序進行遍歷,無非就是前序、後序、中序、層序次序上的變種。對於遞迴函式的呼叫,我們嚴格按照函式給出定義去構建。不需要每次過分糾結在一層層遞迴中,把自己搞暈。因此,遞迴框架最有助於我們從全域性上去分解問題。

第二,明確在當前節點要做的事。當遍歷到當前節點的時候,我是對它的孩子操作,還是說對節點本身有操作都需要理清楚。切忌把手身的太長,想不清楚層次關係,進行多餘的操作。在當前層,只思考當前層的問題。

看題說話。

思路:到了當前層,當前root位置,就交換左右子樹。

同樣的步驟操作root->left,遞迴左子樹。

同樣的步驟操作root->right,遞迴右子樹。

實際上就是個前序遍歷+當前節點操作為交換左右。

當遍歷結束後,自然每個節點都經歷以上三個步驟。完成全部翻轉。

仔細考慮這道題需要兩種next連線狀態。

第一,同父節點的兩個左右孩子相連

第二,不同父節點的孩子節點相連。

依照這個思路,我們需要構思對當前節點的操作來完成我們剛剛的兩個要求。

有點難度的是在於第二個,應該怎麼表示。

很明顯不靠譜,我的錯誤就在於沒有把思維剝離出來,對著 當層節點。寫出這個錯誤關係是還停留在要依靠乙個父節點。事實情況是這樣的嗎?只要我們再多畫一層子樹,就知道問題在哪了。

所以第二種關係的鏈結,在於父子結點不同。那麼我們怎麼通過他們的關係,來進一步幫助我們呢?

對next! 我們使用next將同父子的左右孩子相連,那麼就可以很自然地表現出他們的後代。

也就是

if

(root-

>next)

root-

>right-

>next = root-

>next-

>left;

因此前序遍歷+當前節點操作(兩種型別的鏈結),寫出**。

這道題我們思考的框架是啥呢。

函式展開的呼叫。

1.將左子樹展開

2.將右子樹展開.

3.把左子樹接到右子樹上。

所以這是後序遍歷+當前操作(左子樹接到右子樹上)。

class

solution

root-

>right = right;}}

;

既然可以想想剛剛那樣左-右-根。如果我們先右-左-根會怎麼樣?

我們發現,按照右-左-根的順序遍歷節點,正好符合構成的鍊錶從尾到頭的順序! 那既然如此,咱們就根據當前的遍歷節點,每次把節點依順序插入不就好了嗎? 這裡我們需要引入乙個輔助的指標,來告訴我們當前插入到了鍊錶的**。並且記得刪除左子節點。這後面的過程其實就變成了乙個鍊錶插入的過程。

而不需要像原來一樣需要記錄原先右子樹所在的位置,考慮左子樹插入變動後還要重新定位新的位置。因此減少了複雜度。

class

solution

};

仔細閱讀,我們為三道題梳理的結果是。

二叉樹刷題總結

1.樹相關的問題一般都是可以使用遞迴進行求解的,同時記住乙個思路就是首先是明確當前根節點需要做什麼,然後依次遞迴去左右子樹做什麼即可!一定要明白的是當前根節點做什麼也等同於當前只有乙個節點之後的時候!2.一般題目中可能有兩種型別,一種是單純的遍歷其中的樹節點去完成一些操作,另外一種是去修改對應樹的結...

二叉樹經典題系列 二叉樹的映象

二叉樹的映象 將乙個二叉樹的左右子樹,調換位置。即下圖的形式 遞迴的思想是 從根節點的左右子樹進行交換,然後以根節點的左子樹為根節點,而後以根節點的右結點為根節點,進行左右子樹交換。遇到空節點或葉節點直接返回。下面求二叉樹映象的函式 實現 templatevoid mirrotree treenod...

牛客刷題二叉樹之對稱二叉樹

請實現乙個函式,用來判斷一棵二叉樹是不是對稱的。注意,如果乙個二叉樹同此二叉樹的映象是同樣的,定義其為對稱的。用兩種方式,遞迴和非遞迴 一 遞迴方式 struct treenode class solution bool issymmetricalcore treenode left,treenod...