1. 程式人生 > 資訊 >華為官宣:5 月 19 日 14:30 ,Mate 家族新成員即將亮相

華為官宣:5 月 19 日 14:30 ,Mate 家族新成員即將亮相

總結:一個題目不要想的很複雜,儘可能的讓他很簡單,如果程式走向複雜,一方面你的做法錯了,另一方面可能是沒意義,複雜的程式對自己的程式設計能力沒有提高,同時複雜的程式沒什麼用

根據一棵樹的前序遍歷與中序遍歷構造二叉樹。

注意:
你可以假設樹中沒有重複的元素。

例如,給出

前序遍歷 preorder =[3,9,20,15,7]
中序遍歷 inorder = [9,3,15,20,7]
返回如下的二叉樹:

3
/ \
9 20
/ \
15 7

解法一:遞迴法求解

 private Map<Integer, Integer> indexMap;

    public
TreeNode myBuildTree(int[] preorder, int[] inorder, int preorder_left, int preorder_right, int inorder_left, int inorder_right) { if (preorder_left > preorder_right) { return null; } // 前序遍歷中的第一個節點就是根節點 int preorder_root = preorder_left; // 在中序遍歷中定位根節點
int inorder_root = indexMap.get(preorder[preorder_root]); // 先把根節點建立出來 TreeNode root = new TreeNode(preorder[preorder_root]); // 得到左子樹中的節點數目 int size_left_subtree = inorder_root - inorder_left; // 遞迴地構造左子樹,並連線到根節點 // 先序遍歷中「從 左邊界+1 開始的 size_left_subtree」個元素就對應了中序遍歷中「從 左邊界 開始到 根節點定位-1」的元素
root.left = myBuildTree(preorder, inorder, preorder_left + 1, preorder_left + size_left_subtree, inorder_left, inorder_root - 1); // 遞迴地構造右子樹,並連線到根節點 // 先序遍歷中「從 左邊界+1+左子樹節點數目 開始到 右邊界」的元素就對應了中序遍歷中「從 根節點定位+1 到 右邊界」的元素 root.right = myBuildTree(preorder, inorder, preorder_left + size_left_subtree + 1, preorder_right, inorder_root + 1, inorder_right); return root; } public TreeNode buildTree(int[] preorder, int[] inorder) { int n = preorder.length; // 構造雜湊對映,幫助我們快速定位根節點 indexMap = new HashMap<Integer, Integer>(); for (int i = 0; i < n; i++) { indexMap.put(inorder[i], i); } return myBuildTree(preorder, inorder, 0, n - 1, 0, n - 1); }