根據後序陣列重建搜尋二叉樹

2022-09-21 13:06:12 字數 1765 閱讀 1783

題目:根據後序陣列重建搜尋二叉樹

《程式設計師**面試指南》第44題 p148 難度:士

★☆☆☆

原問題判斷陣列arr是否可能是搜尋二叉樹後序遍歷的結果高階問題通過陣列arr重構二叉樹

原問題的解法:根據二叉樹後序遍歷的順序——左-右-根,頭節點的值一定是陣列的最後乙個元素

然後將除最後乙個元素的陣列一分為二,滿足左邊陣列的所有元素的值均小於最後乙個元素的值,右邊陣列的所有元素的值均大於最後乙個元素的值。如果不滿足這種情況,說明這個陣列一定不可能是搜尋二叉樹後序遍歷的結果。將陣列分為左邊陣列和右邊陣列,相當於將二叉樹分出了左子樹和右子樹,然後再遞迴的進行如上判斷即可。

public boolean ispostarray(int arr) 

return ispost(arr, 0, arr.length - 1);

}public boolean ispost(int arr, int start, int end)

int less = -1;

int more = end;

for (int i = start; i < end; i++) else

}if (less == -1 || more == end)

if (less != more - 1)

return ispost(arr, start, less) && ispost(arr, more, end - 1);

}

高階問題的分析與原問題同理,整個陣列的最後乙個值為二叉樹頭節點的值左部分都比頭節點的值小,用來生成頭節點的左子樹右部分則為其右子樹,通過遞迴生成整個二叉樹

public node posarraytobst(int posarr) 

return postobst(posarr, 0, posarr.length - 1);

}public node postobst(int posarr, int start, int end)

node head = new node(posarr[end]);

int less = -1;

int more = end;

for (int i = start; i < end; i++) else

}head.left = postobst(posarr, start, less);

head.right = postobst(posarr, more, end - 1);

return head;

}

需要注意的是,題解的**中自始至終都只用到了乙個陣列遞迴傳遞的是索引值。而我自己寫的**中使用了arrays.copyofrange()方法,造了很多個陣列,多餘的空間有點浪費。。

根據後序陣列重建搜尋二叉樹

題目 給定乙個整型陣列arr,已知其中沒有重複值,判斷arr是否可能是節點值型別為整型的搜尋二叉樹後序遍歷的結果。public class ispostarray return ispost arr,0,arr.length 1 public static boolean ispost int ar...

根據後序陣列重建搜尋二叉樹

根據後序陣列重建搜尋二叉樹 給定乙個有 n 個不重複整數的陣列 arr,判斷 arr 是否可能是節點值型別為整數的搜尋二叉樹後序遍歷的結果。輸入描述 第一行乙個整數 n,表示陣列的長度。第二行 n 個整數 arr i。輸出描述 如果是搜尋二叉樹後序遍歷的結果則輸出 true 否則輸出 false 示...

根據後序陣列重建二叉樹

題目 給定乙個整型陣列arr,已知沒有重複值,判斷arr是否可能是節點值型別為整型的搜尋二叉樹後序遍歷的結果。高階問題 如果整型陣列中沒有重複值,且已知是一棵二叉搜尋樹的後序遍歷結果,通過arr重構二叉樹。解答 二叉樹的後序遍歷是先左 再右 最後根的順序,所以,頭節點一定是陣列的最後乙個元素。根據搜...