題目:根據後序陣列重建搜尋二叉樹
《程式設計師**面試指南》第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重構二叉樹。解答 二叉樹的後序遍歷是先左 再右 最後根的順序,所以,頭節點一定是陣列的最後乙個元素。根據搜...