题目如下:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
如以下树
1
2 3
4 5 6 7
前序遍历:1.根节点
2.前序遍历左子树
3.前序遍历右子树
中序遍历:1.中序遍历左子树
2.根节点
3.中序遍历右子树
后序遍历:1.后序遍历左子树
2.后序遍历右子树
3.根节点
所以上方树的
前序遍历为{1, 2, 4, 5, 3, 6, 7}
中序遍历为{4, 2, 5, 1, 6, 3, 7}
后序遍历为{4, 5, 2, 6, 7, 3, 1}
Java代码如下:
public TreeNode reConstructBinaryTree(int [] pre,int [] mid) { TreeNode root = buildTree(pre, mid, 0, pre.length - 1, 0, pre.length - 1); return root; } public static TreeNode buildTree(int[] off, int[] mid, int begin1, int end1, int begin2, int end2) { if(begin1 > end1 || begin2 > end2) { return null; } //找到根节点 int rootData = off[end1]; TreeNode head = new TreeNode(rootData); //找到子树范围 int incount = findIndex(rootData, mid, begin2, end2); int offset = incount - begin2 - 1; TreeNode left = buildTree(off, mid, begin1, begin1 + offset, begin2, begin2 + offset); TreeNode right = buildTree(off, mid, end1 - 1 - offset, end1 - 1, incount + 1, end2); head.left = left; head.right = right; return head; } //在中序遍历下寻找根节点 public static int findIndex(int rootData, int[] mid, int begin2, int end2) { for(int i = begin2; i <= end2; i++) { if(mid[i] == rootData) { return i; } } return -1; }
由后序遍历和中序遍历也能重建二叉树
Java代码如下:
public TreeNode reConstructBinaryTree(int [] off,int [] mid) { TreeNode root = buildTree(off, mid, 0, off.length - 1, 0, off.length - 1); return root; } public static TreeNode buildTree(int[] off, int[] mid, int begin1, int end1, int begin2, int end2) { if(begin1 > end1 || begin2 > end2) { return null; } //找到根节点 int rootData = off[end1]; TreeNode head = new TreeNode(rootData); //找到子树范围 int incount = findIndex(rootData, mid, begin2, end2); int offset = incount - begin2 - 1; TreeNode left = buildTree(off, mid, begin1, begin1 + offset, begin2, begin2 + offset); TreeNode right = buildTree(off, mid, end1 - 1 - offset, end1 - 1, incount + 1, end2); head.left = left; head.right = right; return head; } //在中序遍历下寻找根节点 public static int findIndex(int rootData, int[] mid, int begin2, int end2) { for(int i = begin2; i <= end2; i++) { if(mid[i] == rootData) { return i; } } return -1; }