1. 程式人生 > >劍指 Offer - 4:重建二叉樹

劍指 Offer - 4:重建二叉樹

題目描述

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列 {1,2,4,7,3,5,6,8} 和中序遍歷序列 {4,7,2,1,5,3,8,6},則重建二叉樹並返回

題目連結:https://www.nowcoder.com/practice/8a19cbe657394eeaac2f6ea9b0f6fcf6

解題思路

根據前序遍歷的特點,我們可以通過第一個值得到當前子樹的根節點,藉此去中序遍歷查詢根節點的左子樹和右子樹,採用遞迴的思路

public class
Solution { public TreeNode reConstructBinaryTree(int [] pre,int [] in) { // 獲取根節點 int val = pre[0]; TreeNode root = new TreeNode(val); // 得到左子樹的大小 int len = 0; for (; len < in.length; len++) { if (in[len] == val) break; } // 構建左子樹
if (len != 0) { // 左子樹的先序遍歷 int[] pre_left = new int[len]; for (int i = 0; i < len; i++) { pre_left[i] = pre[i+1]; } // 左子樹的中序遍歷 int[] in_left = new int[len]; for (int i = 0; i < len; i++) { in_left[
i] = in[i]; } root.left = reConstructBinaryTree(pre_left, in_left); } // 構建右子樹 if (len != (pre.length-1)) { // 右子樹的先序遍歷 int[] pre_right = new int[pre.length-len-1]; for (int i = 0, idx = len+1; idx < pre.length; i++, idx++) { pre_right[i] = pre[idx]; } // 右子樹的中序遍歷 int[] in_right = new int[in.length-len-1]; for (int i = 0, idx = len+1; idx < in.length; i++, idx++) { in_right[i] = in[idx]; } root.right = reConstructBinaryTree(pre_right, in_right); } return root; } }