欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

LeetCode:construct-binary-tree-from-inorder-and-postorder-traversal

程序员文章站 2022-03-07 23:49:31
...

题目描述
给出一棵树的中序遍历和后序遍历,请构造这颗二叉树。这个是数据结构考试的时候较常考的一道题了,这个和根据先序遍历和中序遍历确定二叉树一样。都是通过先序或后序遍历确定根节点,然后根据中序遍历确定根节点的左右子树。再在左右子树的部分去递归上面的过程。
LeetCode:construct-binary-tree-from-inorder-and-postorder-traversal

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来作为边界的处理是不合适的。

相关标签: LeetCode