前序,中序非遞迴比較容易
前序:先一直壓左孩子,每次壓棧的時候就列印,沒有左孩子可壓,就出棧,同時把右孩子壓棧,繼續一直壓左孩子
中序:先一直壓左孩子,沒有左孩子可壓,就出棧,出棧的時候列印,同時把右孩子壓棧,繼續一直壓左孩子
而後續因為要把左右孩子都遍歷完了才能列印當前節點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 ...