劍指Offer_07_重建二叉樹
阿新 • • 發佈:2021-10-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; } }