把題目的要求細化,搞清楚根節點應該作什麼,而後剩下的事情拋給前/中/後序的遍歷框架,千萬不要跳到遞歸的細節裏,相信你的定義java
對於構造二叉樹的問題,根節點要作的就是想辦法把本身構造出來
咱們確定要遍歷數組找到最大值maxVal,把根節點root作出來,而後對maxVal左邊的數組和右邊的數組進行遞歸調用,做爲root的左右子樹。
僞代碼數組
TreeNode constructMaxImumBinaryTree(int[] nums){ if(num is empty){ return null; } int maxVal=Integer.MIN_VALUE; int index=0; for(int i=0;i<nums.length;i++){ if(nums[i]>maxVal){ maxVal=nums[i]; index=i; } } TreeNode root=new TreeNode(maxVal); //遞歸調用構造左右子樹 root.left=constructMaximumBinaryTree(nums[0]...index-1); root.right=constructMaximumBinaryTree(nums[index+1...nums.length-1]); return root; }
對於每一個根節點來講,最重要的是找到當前數組中的最大值以及它的索引,而後前序遞歸調用構造子樹框架
//主函數 TreeNode constructMaximumBinaryTree(int[] nums){ return build(nums,0,nums.length-1); } TreeNode build(int[] nums,int lo,int hi){ //base case if(lo>hi){ return null; } //找到數組中最大值和對應的索引 int index=-1,maxVal=Integer.MIN_VALUE; for(int i=lo;i<=hi;i++){ if(maxVal<nums[i]){ maxVal=nums[i]; index=i; } } TreeNode root=new TreeNode(maxVal); //遞歸調用構造左右子樹 root.left=build(nums,lo,index-1); root.right=build(nums,index+1,hi); return root; }
這個框架用起來簡直太爽了,咱們須要考慮的是每一個節點須要幹什麼
1.須要建立新節點,根據前序遍歷的結果來找到根節點的值 root.val=preorder[start];
2.咱們還須要肯定左右子樹在數組中的區間,這裏須要添加一個新的變量值,leftNum表明的含義是
子樹在數組中的長度
leftNum=index-start;
而後進行遞歸調用構造左右子樹函數
public TreeNode buildTree(int[] preorder, int[] inorder) { return buildTree(preorder,0,preorder.length,inorder,0,inorder.length); } public TreeNode buildTree(int[] preorder,int pre_start,int pre_end,int[] inorder,int in_start,int in_end){ if(pre_start==pre_end){ return null; } //前序遍歷 //構造節點 int val =preorder[pre_start]; TreeNode root=new TreeNode(val); int index=-1; for(int i=in_start;i<in_end;i++){ if(root.val==inorder[i]){ index=i; break; } } int leftNum=index-in_start; root.left=buildTree(preorder,pre_start+1,pre_start+leftNum+1,inorder,in_start,index); root.right=buildTree(preorder,pre_start+leftNum+1,pre_end,inorder,index+1,in_end); return root; }