剑指offer-重建二叉树
2015-09-14 09:12
330 查看
题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
题目分析
首先应该弄清楚前序遍历,中序遍历,后序遍历的遍历流程,然后应该明白树的递归定义:要么树为空,要么由根和零个或多个非空子树组成。那么,我们就可以用递归重建一棵二叉树。
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
题目分析
首先应该弄清楚前序遍历,中序遍历,后序遍历的遍历流程,然后应该明白树的递归定义:要么树为空,要么由根和零个或多个非空子树组成。那么,我们就可以用递归重建一棵二叉树。
import java.util.Arrays; public class 重建二叉树 { public static TreeNode reConstructBinaryTree(int[] pre, int[] in) { //首先找到根节点,前序遍历的第一个数是根节点上面的值 int rootData = pre[0]; TreeNode root = new TreeNode(rootData);// 找到跟节点 // 在中序遍历中找到rootData的位置 int rootinIndex = 0; int temp = in[rootinIndex]; while (rootinIndex < in.length && rootData != temp) { rootinIndex++; temp = in[rootinIndex]; } if (rootinIndex == in.length && rootData != in[rootinIndex - 1]) { throw new IllegalArgumentException("invalid input"); } // 如果有左孩子节点,那么中序遍历的rootData前面的数据都是左孩子节点上的,前序遍历的[1,rootinIndex]都是左孩子节点上的 if (rootinIndex > 0) { root.left = reConstructBinaryTree( Arrays.copyOfRange(pre, 1, rootinIndex + 1), Arrays.copyOfRange(in, 0, rootinIndex)); } // 如果有右孩子节点,那么中序遍历rootinIndex到最后都是右孩子节点上的,前序遍历的rootinIndex到最后也都是右孩子节点上的 if (rootinIndex < in.length - 1) { root.right = reConstructBinaryTree( Arrays.copyOfRange(pre, rootinIndex + 1, pre.length), Arrays.copyOfRange(in, rootinIndex + 1, in.length)); } return root; } public static void main(String[] args) { int[] preOrder = { 1, 2, 4, 7, 3, 5, 6, 8 }; int[] inOrder = { 4, 7, 2, 1, 5, 3, 8, 6 }; TreeNode root = reConstructBinaryTree(preOrder, inOrder); inOrder(root); System.out.println(); preOrder(root); System.out.println(); postOrder(root); } public static void preOrder(TreeNode n) { if (n != null) { System.out.print(n.val + ","); preOrder(n.left); preOrder(n.right); } } public static void inOrder(TreeNode n) { if (n != null) { inOrder(n.left); System.out.print(n.val + ","); inOrder(n.right); } } public static void postOrder(TreeNode n) { if (n != null) { postOrder(n.left); postOrder(n.right); System.out.print(n.val + ","); } } } class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } }
相关文章推荐
- AVL树-自平衡二叉查找树(Java实现)
- C#中的递归APS和CPS模式详解
- WinForm实现按名称递归查找控件的方法
- C#中的尾递归与Continuation详解
- C语言二叉树的非递归遍历实例分析
- 使用C语言构建基本的二叉树数据结构
- C#递归实现显示文件夹及所有文件并计算其大小的方法
- C++非递归队列实现二叉树的广度优先遍历
- php递归创建目录的方法
- C#使用前序遍历、中序遍历和后序遍历打印二叉树的方法
- Javascript递归打印Document层次关系实例分析
- oracle 使用递归的性能提示测试对比
- 使用curl递归下载软件脚本分享
- Perl脚本实现递归遍历目录下的文件
- JavaScript的递归之递归与循环示例介绍
- C# 递归查找树状目录实现方法
- 全排列算法的非递归实现与递归实现的方法(C++)
- php递归列出所有文件和目录的代码
- java递归菜单树转换成pojo对象
- 一个JavaScript递归实现反转数组字符串的实例