LeetCode:construct-binary-tree-from-inorder-and-postorder-traversal
程序员文章站
2022-03-07 23:49:31
...
题目描述
给出一棵树的中序遍历和后序遍历,请构造这颗二叉树。这个是数据结构考试的时候较常考的一道题了,这个和根据先序遍历和中序遍历确定二叉树一样。都是通过先序或后序遍历确定根节点,然后根据中序遍历确定根节点的左右子树。再在左右子树的部分去递归上面的过程。
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
public class ConstructBinaryTreeFromInorderAndPostorderTraversal {
public static TreeNode buildTree(int[] inorder, int[] postorder) {
return buildTree(inorder, 0, inorder.length - 1, postorder, 0, postorder.length - 1);
}
private static TreeNode buildTree(int[] inorder, int inLeft, int inRight, int[] postorder, int postLeft,
int postRight) {
// TODO Auto-generated method stub
if (postRight < postLeft) {
return null;
}
// 根据后序遍历可以知道根节点
TreeNode node = new TreeNode(postorder[postRight]);
if (postRight == postLeft) {
return node;
}
// 根据后序确定的根节点在中序中找到对应的位置
int num = 0;
for (int i = 0; i < inorder.length; i++) {
if (postorder[postRight] == inorder[i]) {
num = i;
break;
}
}
// 获得当前跟节点左边节点的个数
int length = num - inLeft;
node.left = buildTree(inorder, inLeft, inLeft + length - 1, postorder, postLeft, postLeft + length - 1);
node.right = buildTree(inorder, num + 1, inRight, postorder, postLeft + length, postRight - 1);
return node;
}
}
写一下自己在做这个题中犯的一个错误:我在往子树递归的时候,左右子树的边界我是使用的postRight-length-1和postRight-length,这样是不对的,因为从上面的图上可以看出如果使用postRight-length-1来作为边界的处理是不合适的。