/**
* 106. 从中序与后序遍历序列构造二叉树
* @author wsq
* @date 2020/09/25
根据一棵树的中序遍历与后序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
例如,给出
中序遍历 inorder = [9,3,15,20,7]
后序遍历 postorder = [9,15,7,20,3]
返回如下的二叉树:
3
/ \
9 20
/ \
15 7
链接:https://leetcode-cn.com/problems/construct-binary-tree-from-inorder-and-postorder-traversal
*/
package notsubmit;
public class MidPosBuildTree {
/**
* 根据后序遍历与中序遍历的特点
* 采用递归的方式构建二叉树
* 以后会尝试使用迭代的方式实现树的构建
* @param inorder
* @param postorder
* @return
*/
public TreeNode buildTree(int[] inorder, int[] postorder) {
int inLen = inorder.length;
int posLen = postorder.length;
if(inLen == 0 || posLen == 0 || inLen != posLen) {
return null;
}
// 递归建树
TreeNode root = reBuildTree(inorder, postorder, 0, inLen - 1, 0, posLen - 1);
return root;
}
private TreeNode reBuildTree(int[] inorder, int[] postorder,
int inStart, int inEnd,
int postStart, int postEnd) {
// TODO Auto-generated method stub
if(inStart > inEnd || postStart > postEnd) {
return null;
}
int rootVal = postorder[postEnd];
TreeNode rootNode = new TreeNode(postorder[postEnd]);
if(postStart == postEnd) {
return rootNode;
}
int inPos = findInorder(inorder, inStart, inEnd, rootVal);
int leftTreeNum = inPos - inStart;
rootNode.left = reBuildTree(inorder, postorder, inStart, inPos - 1, postStart, postStart + leftTreeNum - 1);
rootNode.right = reBuildTree(inorder, postorder, inPos + 1, inEnd, postStart + leftTreeNum, postEnd - 1);
return rootNode;
}
private int findInorder(int[] inorder, int inStart, int inEnd, int rootVal) {
// TODO Auto-generated method stub
for(int i = inStart; i <= inEnd; ++i) {
if(inorder[i] == rootVal) {
return i;
}
}
return -1;
}
public static void main(String[] args) {
int[] inorder = {2, 1};
int[] postorder = {2, 1};
MidPosBuildTree bt = new MidPosBuildTree();
TreeNode head = bt.buildTree(inorder, postorder);
}
}
106. 从中序与后序遍历序列构造二叉树(递归版)
最新推荐文章于 2022-02-12 14:55:51 发布