1. 程式人生 > 其它 >劍指Offer_07_重建二叉樹

劍指Offer_07_重建二叉樹

題目描述

輸入某二叉樹的前序遍歷和中序遍歷的結果,請構建該二叉樹並返回其根節點。

假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。

示例 1:

Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
Output: [3,9,20,null,null,15,7]

示例 2:

Input: preorder = [-1], inorder = [-1]
Output: [-1]

限制:

0 <= 節點個數 <= 5000

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/zhong-jian-er-cha-shu-lcof

解題思路

題目要求通過前序遍歷和中序遍歷生成二叉樹
前序遍歷:先輸出根節點,然後再輸出左子樹和右子樹
中序遍歷:先輸出左子樹,然後輸出根節點,最後輸出右子樹
通過觀察發現:
1、前序遍歷陣列的第一個節點是根節點
2、在中序遍歷陣列中,根節點所在位置左側的節點屬於左子樹,右側節點屬於右子樹
使用遞迴實現,找到根節點,然後將剩餘節點分為左子樹和右子樹,不斷尋找根節點,拆分剩餘節點,直至只有一個節點或沒有節點

程式碼

class Solution {
        public TreeNode buildTree(int[] preorder, int[] inorder) {
          return buildRoot(preorder,0,preorder.length-1,inorder,0,inorder.length-1);
        }
        public TreeNode buildRoot(int[] preorder,int preStart,int preEnd,int[] inorder,int inStart,int inEnd){
            int length = preEnd-preStart;
            if(length<0)return null;
            TreeNode root = new TreeNode(preorder[preStart]);
            if(length==0)return root;
            int pos = 0;
            while(inStart+pos<inEnd){
                if(inorder[inStart+pos]==root.val){
                    break;
                }
                pos++;
            }
            if(pos > 0){

                root.left=buildRoot(preorder,preStart+1,preStart+pos,inorder,inStart,inStart+pos-1);
            }
            if(inStart + pos < inEnd){

                root.right=buildRoot(preorder,preStart+pos+1,preEnd,inorder,inStart+pos+1,inEnd);
            }
            return root;
        }
    }