diff --git a/problems/0106.从中序与后序遍历序列构造二叉树.md b/problems/0106.从中序与后序遍历序列构造二叉树.md index 907f91f6..e51cf08b 100644 --- a/problems/0106.从中序与后序遍历序列构造二叉树.md +++ b/problems/0106.从中序与后序遍历序列构造二叉树.md @@ -585,46 +585,38 @@ Java: ```java class Solution { public TreeNode buildTree(int[] inorder, int[] postorder) { - if (inorder.length == 0 || postorder.length == 0) return null; - return buildTree(inorder, postorder,0,inorder.length,0,postorder.length); + return buildTree1(inorder, 0, inorder.length, postorder, 0, postorder.length); } - - private TreeNode buildTree(int[] inorder, int[] postorder, int infrom, int into, - int postfrom, int postto) { - if (postfrom == postto) return null; - - int rootValue = postorder[postto - 1]; - TreeNode root = new TreeNode(rootValue); - - if (postfrom + 1 == postto) return root; - - int splitNum = postto - 1; - for (int i = infrom; i < into; i++) { - if (inorder[i] == rootValue) { - splitNum = i; - break; + public TreeNode buildTree1(int[] inorder, int inLeft, int inRight, + int[] postorder, int postLeft, int postRight) { + // 没有元素了 + if (inRight - inLeft < 1) { + return null; + } + // 只有一个元素了 + if (inRight - inLeft == 1) { + return new TreeNode(inorder[inLeft]); + } + // 后序数组postorder里最后一个即为根结点 + int rootVal = postorder[postRight - 1]; + TreeNode root = new TreeNode(rootVal); + int rootIndex = 0; + // 根据根结点的值找到该值在中序数组inorder里的位置 + for (int i = inLeft; i < inRight; i++) { + if (inorder[i] == rootVal) { + rootIndex = i; } } - - int inLeftBegin = infrom; - int inLeftEnd = splitNum; - int inRightBegin = splitNum + 1; - int inRightEnd = into; - - int postLeftBegin = postfrom; - int postLeftEnd = postLeftBegin + (splitNum - inLeftBegin); - int postRightBegin = postLeftBegin + (splitNum - inLeftBegin); - int postRightEnd = postto - 1; - - root.left = buildTree(inorder,postorder,inLeftBegin,inLeftEnd,postLeftBegin,postLeftEnd); - root.right = buildTree(inorder,postorder,inRightBegin,inRightEnd,postRightBegin,postRightEnd); - + // 根据rootIndex划分左右子树 + root.left = buildTree1(inorder, inLeft, rootIndex, + postorder, postLeft, postLeft + (rootIndex - inLeft)); + root.right = buildTree1(inorder, rootIndex + 1, inRight, + postorder, postLeft + (rootIndex - inLeft), postRight - 1); return root; } } ``` - Python: