在java中已知前序和中序求后序的問題是一道經(jīng)典的二叉樹問題。一般來說,前序和中序都可以唯一的確定一個二叉樹,通過對于前序和中序進(jìn)行分析,我們可以得出二叉樹的后序遍歷。
public String getPostOrder(int[] preorder, int[] inorder) { if (preorder == null || inorder == null || preorder.length != inorder.length || inorder.length == 0) { return null; } int rootValue = preorder[0]; int rootIndex = -1; for (int i = 0; i< inorder.length; i++) { if (inorder[i] == rootValue) { rootIndex = i; break; } } if (rootIndex == -1) { return null; } int[] leftInorder = Arrays.copyOfRange(inorder, 0, rootIndex); int[] rightInorder = Arrays.copyOfRange(inorder, rootIndex + 1, inorder.length); int[] leftPreorder = Arrays.copyOfRange(preorder, 1, rootIndex + 1); int[] rightPreorder = Arrays.copyOfRange(preorder, rootIndex + 1, preorder.length); String leftPostOrder = getPostOrder(leftPreorder, leftInorder); String rightPostOrder = getPostOrder(rightPreorder, rightInorder); StringBuilder postOrder = new StringBuilder(); postOrder.append(leftPostOrder); postOrder.append(rightPostOrder); postOrder.append(rootValue); return postOrder.toString(); }
在這段代碼中,我們使用了分治的思想來實(shí)現(xiàn)此問題,首先我們找到前序遍歷的第一個節(jié)點(diǎn)就是樹的根節(jié)點(diǎn),接著我們在中序遍歷中找到根節(jié)點(diǎn)的位置。根據(jù)根節(jié)點(diǎn)的位置,我們就可以得到左子樹和右子樹的前序和中序遍歷順序,接著我們遞歸的求解左子樹和右子樹的后序遍歷順序,最終將左子樹的后序遍歷、右子樹的后序遍歷和根節(jié)點(diǎn)的值相連接,就可以得到整個樹的后序遍歷順序。