Q4--重建二叉树
2016-09-03 20:50
316 查看
一、题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},可以重建出它的二叉树并输出它的头结点。二、解题思路
前序遍历序列中,第一个数总是根节点。中序遍历序列中,根节点的值在序列中间,左子树位于根节点值的左边,右子树位于根节点右边。扫描中序序列,找到根节点后就可以得到中序序列的左子树和右子树,然后根据左子树的长度,知道前序序列中根节点后面相同长度的节点为前序序列的左子树节点,后面的是右子树节点,然后递归地对左子树和右子树采用相同的方法。三、java代码实现
import java.util.LinkedList; import java.util.Queue; //树节点的定义 class TreeNode{ int val; TreeNode left; TreeNode right; TreeNode(int x){ val = x;} } public class Main{ public static void main(String[] args){ int[] pre = {1,2,4,7,3,5,6,8}; int[] in = {4,7,2,1,5,3,8,6}; TreeNode root = reConstruct(pre,in); //重构二叉树,返回根节点 postOrder(root); //后序遍历二叉树 System.out.println(); levelOrder(root);////层次遍历二叉树 } public static TreeNode reConstruct(int[] pre, int[] in){ if(pre == null || in == null) return null; else return reConstruct(pre, 0, pre.length-1, in, 0, in.length-1); } public static TreeNode reConstruct(int[] pre, int preStart, int preEnd, int[] in, int inStart, int inEnd){ //根据前序序列的第一个元素构建根节点 int rootValue = pre[preStart]; TreeNode root = new TreeNode(rootValue); root.left = null; root.right = null; if(preStart == preEnd){ if(inStart == inEnd){ return root; } else throw new RuntimeException("input error"); } //在中序序列中寻找根节点 int index = inStart; while(index <= inEnd && in[index] != rootValue) index++; //得到左子树的长度+1 int len = index - inStart; //构建左子树 if(len > 0) root.left = reConstruct(pre, preStart+1, preStart+len, in, inStart, index-1); //构建右子树 if(len < preEnd - preStart ) root.right = reConstruct(pre, preEnd - len, preEnd, in, index+1, inEnd ); return root; } //递归实现后序遍历 public static void postOrder(TreeNode root){ if(root == null) return; if(root.left != null) postOrder(root.left); if(root.right != null) postOrder(root.right); System.out.print(root.val); } //用队列实现层次遍历 public static void levelOrder(TreeNode root){ if(root == null) return; //System.out.print(root.val); Queue<TreeNode> q = new LinkedList<TreeNode>(); q.add(root); while(!q.isEmpty()){ TreeNode node = q.poll(); System.out.print(node.val); if(node.left != null) q.add(node.left); if(node.right != null) q.add(node.right); } } }
相关文章推荐
- AVL树-自平衡二叉查找树(Java实现)
- 文件遍历排序函数
- Lua 学习笔记之C API 遍历 Table实现代码
- C#遍历文件夹后上传文件夹中所有文件错误案例分析
- C#中遍历Hashtable的4种方法
- Erlang中遍历取出某个位置的最大值代码
- C++实现图的邻接矩阵存储和广度、深度优先遍历实例分析
- C++实现图的邻接表存储和广度优先遍历实例分析
- C语言二叉树的非递归遍历实例分析
- 使用C语言构建基本的二叉树数据结构
- 一波二叉树遍历问题的C++解答实例分享
- 举例讲解C语言程序中对二叉树数据结构的各种遍历方式
- C++非递归队列实现二叉树的广度优先遍历
- php遍历目录方法小结
- 一个目录遍历函数
- php遍历删除整个目录及文件的方法
- PHP遍历文件夹与文件类及处理类用法实例
- PHP遍历XML文档所有节点的方法
- 平衡二叉树
- 二叉树