LeetCode刷題筆錄Construct Binary Tree from Preorder and Inorder Traversal

Given preorder and inorder traversal of a tree, construct the binary tree.

Note:

You may assume that duplicates do not exist in the tree.

像一般的tree的問題一樣,這題也用遞歸比較好。

比如這樣子的序列:

preorder: 1245367

inorder: 4251637

可以一眼看出的是1一定是這顆樹的root,因爲pre order traversal是先訪問節點本身再訪問子樹的。再看看in order traversal裏面1的位置,是在中間。按照Inorder的定義,先訪問左子樹再訪問右子樹。因此可以知道在In order traversal的序列中排在1前面的都是1的左子樹的元素,排在1後面的都是1的右子樹的元素。對於序列425,其pre order traversal必然是245;對於序列637,其pre order traversal必然是367.這樣就有了一個基本的遞歸。

public class Solution {
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        TreeNode root = buildTree(preorder, inorder, 0, 0, inorder.length - 1);
        return root;
    }
    
    public TreeNode buildTree(int[] preorder, int[] inorder, int preIndex, int inStart, int inEnd){
        if(inStart > inEnd)
            return null;
        TreeNode node = new TreeNode(preorder[preIndex]);
        if(inStart == inEnd)
            return node;
        else{
            int inIndex = search(inorder, preorder[preIndex]);
            int len = inIndex - inStart;
            node.left = buildTree(preorder, inorder, preIndex + 1, inStart, inIndex - 1);
            node.right = buildTree(preorder, inorder, preIndex + len + 1, inIndex + 1, inEnd);
            return node;
        }
    }
    public int search(int[] arr, int value){
        int index = -1;
        for(int i = 0; i < arr.length; i++){
            if(arr[i] == value){
                index = i;
                break;
            }
        }
        return index;
    }
}



發佈了123 篇原創文章 · 獲贊 2 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章