從中序與後序遍歷序列構造二叉樹
題目描述:根據一棵樹的中序遍歷與後序遍歷構造二叉樹。
注意:
你可以假設樹中沒有重複的元素。示例說明請見LeetCode官網。
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/probl...
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
解法一:遞迴
根據中序遍歷和後序遍歷的性質,通過遞迴的方式求解,遞迴的過程如下:
- 首先,如果中序遍歷序列或後序遍歷序列為空,直接返回空樹;
- 因為後序遍歷序列的最後一個值為根節點,所以首先根據這個初始化得到當前的根節點root;
- 然後根據根節點root在中序遍歷序列中的位置,根節點前面的值都是當前根節點的左子樹節點,得到當前根節點左右子樹節點的數量;
- 然後通過呼叫遞迴方法得到當前根節點的左右子樹;
- 最後返回root即為還原後的樹。
import com.kaesar.leetcode.TreeNode;
import java.util.Arrays;
public class LeetCode_106 {
public static TreeNode buildTree(int[] inorder, int[] postorder) {
// 如果中序遍歷序列或後序遍歷序列為空,直接返回空樹
if (inorder == null || inorder.length == 0) {
return null;
}
// 後序遍歷序列的最後一個值為根結點的值
int rootVal = postorder[postorder.length - 1];
TreeNode root = new TreeNode(rootVal);
int leftCount = 0;
// 中序遍歷序列前面的值為左子樹的節點,得到左子樹的節點數量
for (int val : inorder) {
if (val != rootVal) {
leftCount++;
} else {
break;
}
}
// 遞迴得到當前根節點的左右子樹
root.left = buildTree(Arrays.copyOfRange(inorder, 0, leftCount), Arrays.copyOfRange(postorder, 0, leftCount));
root.right = buildTree(Arrays.copyOfRange(inorder, leftCount + 1, inorder.length), Arrays.copyOfRange(postorder, leftCount, inorder.length - 1));
return root;
}
public static void main(String[] args) {
// 測試用例
// 中序遍歷序列
int[] inorder = new int[]{9, 3, 15, 20, 7};
// 後序遍歷序列
int[] postorder = new int[]{9, 15, 7, 20, 3};
buildTree(inorder, postorder).print();
}
}
【每日寄語】 命運負責洗牌,但是玩牌的是我們自己!