1. 程式人生 > 其它 >[演算法練習及思路-leetcode劍指offer(Java解法)]No05.重建二叉樹

[演算法練習及思路-leetcode劍指offer(Java解法)]No05.重建二叉樹

技術標籤:JAVA演算法練習劍指offer二叉樹演算法資料結構leetcodejava

題目

題號:5
題目名: 重建二叉樹

程式語言

Java

題目描述

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

初次思路

前序遍歷和中序遍歷,中序遍歷和後續遍歷都是一樣的邏輯

邏輯:

1.根據前序或者後續遍歷找到根節點

2.根節點找到在中序遍歷的位置

3.使用中序遍歷根節點左邊的資料做左子樹,右邊的資料做右子樹

4.這是一個遞迴過程,如果建樹成功則退出迴圈

解題程式碼

public class Solution {
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        //中序遍歷的兩邊的結點,左邊是他的左子樹,右邊是他的右子樹
        //前序遍歷先找到的是根節點
        //找到根節點,根節點的左子樹是中序遍歷左邊的數,右子樹是中序遍歷右邊的數
        //如果結點個數是0個,那麼直接返回空
        if(preorder==null||preorder.length==0) return null;
int len = preorder.length; //前序遍歷的結點是當前的根節點 TreeNode root = new TreeNode(preorder[0]); int idx = -1; //從中序遍歷找到當前結點的位置 for (int i = 0; i < preorder.length; i++) { if(preorder[0]==inorder[i]){ idx = i; break; }
} //構造當前節點的左子樹 root.left = buildTree(Arrays.copyOfRange(preorder,1,idx+1),Arrays.copyOfRange(inorder,0,idx)); //構造當前節點的右子樹 root.right = buildTree(Arrays.copyOfRange(preorder,idx +1,len),Arrays.copyOfRange(inorder,idx+1,len)); return root; } }