剑指offer--(4) 重建二叉树
来源:互联网 发布:张逗张花 知乎 编辑:程序博客网 时间:2024/06/07 07:44
剑指offer–(4) 重建二叉树
题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
思路描述:
1. 前序遍历的第一个节点为根节点,故1为根节点;
2. 根据中序遍历,可得{4,7,2}为节点1的左子树的中序遍历,{5,3,8,6}节点1的右子树的中序遍历;
3. 再根据前序遍历,得到{2,4,7}为节点1的左子树的前序遍历,{3,5,8,6}为节点1右子树的中序遍历;
4. 分别对左子树和右子树重复步骤1,2,3
5. 即可得到二叉树为
1
/ \
2 3
/ / \
4 5 6
\ /
7 8
Java 实现过程为:
package com;class TreeNode{ int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; }}public class 重建二叉树 { public static void main(String[] args) { // TODO Auto-generated method stub int[] pre={1,2,4,7,3,5,6,8}; int[] in={4,7,2,1,5,3,8,6}; TreeNode treeNode= reConstructBinaryTree(pre,in); //System.out.println(treeNode); //打印中序遍历 System.out.print("中序-->"); printIn(treeNode); System.out.println(); System.out.print("前序-->"); printPre(treeNode); System.out.println(); System.out.print("后序-->"); printBack(treeNode); } //打印中序遍历 private static void printIn(TreeNode treeNode) { // TODO Auto-generated method stub if(treeNode.left!=null) printIn(treeNode.left); System.out.print(treeNode.val+" "); if(treeNode.right!=null) printIn(treeNode.right); } //打印前序遍历 private static void printPre(TreeNode treeNode) { // TODO Auto-generated method stub System.out.print(treeNode.val+" "); if(treeNode.left!=null) printPre(treeNode.left); if(treeNode.right!=null) printPre(treeNode.right); } //打印后序遍历 private static void printBack(TreeNode treeNode) { // TODO Auto-generated method stub if(treeNode.left!=null) printBack(treeNode.left); if(treeNode.right!=null) printBack(treeNode.right); System.out.print(treeNode.val+" "); } public static TreeNode reConstructBinaryTree(int [] pre,int [] in) { if(pre.length==0||pre.length==0){ return null; } //前序遍历的第一个节点即为根节点 return getTreeNode(pre,0,pre.length-1,in,0,in.length-1); } private static TreeNode getTreeNode(int [] pre,int p_start,int p_end,int [] in,int i_start,int i_end){ if(p_start>=0&&i_start>=0&&p_end<pre.length&&i_end<in.length&&i_start <=i_end&&p_start<=p_end){ TreeNode treeNode=new TreeNode(pre[p_start]); if(p_start==p_end) return treeNode; int index=getIndex(pre[p_start], in, i_start, i_end); int l_left=index-i_start; treeNode.left = getTreeNode(pre,p_start+1,p_start+l_left,in,i_start,i_start+l_left-1); treeNode.right = getTreeNode(pre,p_start+l_left+1,p_end,in,i_start+l_left+1,i_end); return treeNode; }else{ return null; } } private static int getIndex(int k,int [] in,int i_start,int i_end){ for(int i=i_start;i<=i_end;i++){ if(in[i]==k) return i; } return -1; }}
阅读全文
0 0
- 剑指offer--(4) 重建二叉树
- 剑指offer:(4)树:重建二叉树
- 剑指offer 4 重建二叉树
- 《剑指offer》—4、重建二叉树
- 剑指Offer(4)______重建二叉树
- 剑指offer(4)—重建二叉树
- [剑指offer]算法4 重建二叉树
- 剑指offer(5):重建二叉树
- 重建二叉树(剑指offer)
- 剑指offer(四)重建二叉树
- (剑指offer)重建二叉树
- 剑指offer---重建二叉树(6)
- 剑指Offer(四)重建二叉树
- 剑值offer(4)-重建二叉树
- 剑指Offer——(4)重建二叉树
- 【剑指offer-解题系列(4)】重建二叉树
- 重建二叉树 (剑指Offer 第 4 题)
- 剑指offer 编程题(4):重建二叉树
- PCA方法及其应用
- 【9月16日】中文信息MMT模型
- 关于 apply,call 和 bind 的理解
- Inteillj IDEA Web项目配置
- java中String和int 的转换
- 剑指offer--(4) 重建二叉树
- 词向量源码解析:(5.8)ngram2vec源码解析之counts2ppmi等
- robotframework ‘ascii’ codec can’t decode byte 0xe6 in position 977
- 内存地址空间布局
- FFmpeg的IO分析
- Storm的相关概念
- java数据结构-集合
- 背包问题
- uva 1374 Power Calculus