二叉樹相關問題

2021-08-02 02:28:27 字數 3197 閱讀 5114

前序,中序非遞迴比較容易

前序:先一直壓左孩子,每次壓棧的時候就列印,沒有左孩子可壓,就出棧,同時把右孩子壓棧,繼續一直壓左孩子

中序:先一直壓左孩子,沒有左孩子可壓,就出棧,出棧的時候列印,同時把右孩子壓棧,繼續一直壓左孩子

而後續因為要把左右孩子都遍歷完了才能列印當前節點node,而又不能通過node把左右孩子聯絡起來(前中序都有當前節點在棧中維持node.left,node.right的聯絡)

後續有2種辦法:

(1)後續是左右中,我們先求中右左(稍微修改前序遍歷),然後反過來輸出,

(2)維護2個變數,儲存棧頂node,之前列印的node,根據兩者判斷對當前節點列印到什麼程度了(左孩子沒列印?左孩子列印了,右孩子沒有列印?左右孩子都列印了)

注意這裡所說的子樹是:如果選取了某個root節點,那root節點所有的孩子節點都要包括進去

這個題目的思想是:根據左右子樹收集的資訊,整合判斷當前節點的資訊,然後希望子樹收集什麼就遞迴呼叫

這裡需要4個資訊:

1. 樹的max value

2. 樹的min value

3. 最大搜尋子樹的頭結點

4. 最大搜尋子樹的長度

當把左右子樹的這8個資訊收集上來了後,當前節點的這4個資訊可以求得:

1. 樹的max value:max(left_max, right_max)

2. 樹的min value:min(left_min, right_min)

3. 先判斷是否能把左右子樹連起來組成更大的bst(left_bst_root_node==left && right_bst_root_node==right && lmaxvalue),如果可以就返回當前節點,否則就根據左右子樹最大bst長度決定用那邊

4. 見3

記得之前自己在lc上做的是用個全域性變數儲存max,其實本質上也是從子樹收集資訊(子樹的高度)

之前最開始的想法是:遍歷樹,遍歷的時候決策:是不是把當前節點設定為路徑的開始,然後全域性儲存乙個max長度即可

but, it turns out it originates from a 演算法原型:子陣列累加和為target的最長長度

在那個演算法原型用的是hasntable,這裡換成樹也是類似的思路,也是遍歷的時候累加,無非樹需要回退到之前狀態往其他子樹遍歷,那就同時把sum和hashtable回退就好了嘛

public static int getmaxlength(node head, int sum) 

public static int preorder(node head, int sum, int presum, int level,

int maxlen, hashmapsummap)

int cursum = presum + head.value;

if (!summap.containskey(cursum))

if (summap.containskey(cursum - sum))

maxlen = preorder(head.left, sum, cursum, level + 1, maxlen, summap);

maxlen = preorder(head.right, sum, cursum, level + 1, maxlen, summap);

if (level == summap.get(cursum))

return maxlen;

}

二叉樹相關問題

樹的基本概念 樹的度 樹中所有節點中最大的度 節點的層數 節點的層數從樹根開始計算,根節點是第一層,依次向下為第2.3.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 ...