通过两种深度优先遍历方式重建二叉树或者得到其余一种遍历方式

  重建二叉树的方法有很多种,但是并不是通过任意两种深度优先遍历方式都可以重建二叉树,它也是有限制的。

  通过前序+中序、后序+中序、层序+中序这三种方式是可以重建二叉树的,但是通过前序+后序、前序+层序、后序+层序这三种方式是不能重建二叉树的。本文重点讲解通过前序+中序的方式重建二叉树的基本思想以及具体的代码实现。

基本思想

  中序遍历的第一个节点是root节点,在前序遍历中找到root, root的前半段就是root的左子树的前序遍历(长度M), root的后半段就是root的右子树的前序遍历(长度N),因此在前序遍历种,root之后长度M的序列是root的左子树的中序遍历,再后面N个就是root右子树的中序遍历,重复上述过程即可。

代码实现

 1 /**
 2  * 二叉树节点的定义
 3  * public class TreeNode {
 4  *     int val;
 5  *     TreeNode left;
 6  *     TreeNode right;
 7  *     TreeNode(int x) { val = x; }
 8  * }
 9  */
10 public class reConstruct{
11     public TreeNode reConstructBinaryTree(int [] pre, int [] in){
12         TreeNode treeNode = reConstruct(pre,0,pre.length-1,in,0,in.length-1);
13         return treeNode;
14     }
15
16     private TreeNode reConstruct(int[] pre,int startPre,int endPre,int[] in,int startIn,int endIn){
17         if(startPre>endPre || startIn>endIn){
18             return null;
19         }
20         TreeNode treeNode = new TreeNode(pre[startPre]);
21         for(int i=startIn;i<=endIn;i++){
22             if(in[i]==pre[startPre]){
23                 treeNode.left = reConstruct(pre,startPre+1,startPre+i-startIn,in,startIn,i-1);
24                 treeNode.right = reConstruct(pre,startPre+i-startIn+1,endPre,in,i+1,endIn);
25                 break;
26             }
27         }
28         return treeNode;
29     }
30 }

 

原文地址:https://www.cnblogs.com/Demrystv/p/9058536.html

时间: 2024-07-31 07:33:55

通过两种深度优先遍历方式重建二叉树或者得到其余一种遍历方式的相关文章

027依据前序遍历和中序遍历,重建二叉树(keep it up)

剑指offer中题目:http://ac.jobdu.com/problem.php?pid=1385 题目描写叙述: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.如果输入的前序遍历和中序遍历的结果中都不含反复的数字. 比如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并输出它的后序遍历序列. 输入: 输入可能包括多个測试例子,对于每一个測试案例, 输入的第一行为一个整数n(1<=n<=1000):代表二叉树的节点

二叉树(14)----由前序遍历和中序遍历重建二叉树

1.二叉树定义 typedef struct BTreeNodeElement_t_ { void *data; } BTreeNodeElement_t; typedef struct BTreeNode_t_ { BTreeNodeElement_t *m_pElemt; struct BTreeNode_t_ *m_pLeft; struct BTreeNode_t_ *m_pRight; } BTreeNode_t; 二.根据前序遍历序列和中序遍历序列重建二叉树 算法说明: 由中序遍历序

剑指offer[4]——重建二叉树

题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回. 先序遍历是按照中--左--右的方式对二叉树进行遍历,由这种遍历方式我们可以很容易理解现需遍历的第一个数字是根节点的值. 比如说这个二叉树的线序遍历就是1-2-4-7-3-5-6-8,第一个数字就是根节点的值. 而中序遍历,顾名思义,就是按照左--中--

[Jobdu]题目1385:重建二叉树

根据一棵二叉树的先序遍历和后序遍历,重建二叉树 例子: 我们先来看一个例子,二叉树如上图,则先序遍历为:1 2 4 7 3 5 6 8,中序遍历为:4 7 2 1 5 3 8 6 思路: 先序遍历中的第一个元素为根节点,这个元素将中序遍历划分为左右两个部分,左边的为左子树的中序遍历,右边的为右子树的中序遍历,同样也可以将先序遍历除了第一个元素以外的划分为两个部分,第一个部分是左子树的先序遍历,第二部分是右子树的先序遍历. 由此可知,这是一个递归过程,可以利用递归函数来构建二叉树.对于二叉树的这种

【剑指Offer】4、重建二叉树

??题目描述: ??输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回根结点. ??解题思路: ??树的遍历有三种:分别是前序遍历.中序遍历.后序遍历.本题是根据前序和中序遍历序列重建二叉树,我们可以通过一个具体的实例来发现规律,不难发现:前序遍历序列的第一个数字就是树的根结点.在中序遍历序列中,可以扫描找到根结点

4、重建二叉树------------&gt;剑指offer系列

题目1-二叉树重建 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字. 例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回. 思路 前序遍历:跟节点 + 左子树前序遍历 + 右子树前序遍历 中序遍历:左子树中序遍历 + 跟节点 + 右字数中序遍历 后序遍历:左子树后序遍历 + 右子树后序遍历 + 跟节点 根据上面的规律: 前序遍历找到根结点root 找到root在

Pro 6 重建二叉树(java)

注:(1)java中树的构建 (2)构建子树时可以直接利用Arrays.copyOfRange(preorder, from, to),这个方法是左开右闭的 1 package com.xsf.SordForOffer; 2 3 import java.util.Arrays; 4 5 /*剑指offer第6个问题 6 根据前序和中序遍历来重建二叉树 7 */ 8 class BinaryTreeNode { 9 public int value; 10 public BinaryTreeNod

二叉树基础(创建方法,遍历方法(前序/中序/后序/层序、递归/非递归)

二叉树的创建及遍历是很多二叉树问题的基础,递归遍历逻辑清晰,代码简约漂亮,然则效率低下(所有递归方案的通病,非不得已不用递归): 非递归遍历高效,却不是能信手写出来的,特别是后续非递归遍历,相信很多资深码工也有这样的经历: 5年前学习了二叉树的非递归遍历,一个月前复习了并达到能熟练写出的程度,在不参考任何资料的情况下,今天却怎样也写不出来. 如果你也有过这种经历,恭喜你,这说明你是一个正常人…… 另一方面市面上有些国人写的教材,各种语法.逻辑错误层出不起,不知祸害了多少未来的码工,深感痛心. 印

Pro 6 重建二叉树

思路: (1)需要了解前序遍历和和中序遍历的特点,前序遍历第一个元素即为根节点,然后再在中序遍历以这个根节点为界限得到宏观上的左子串和右子串,如下图 (2)又可以将截取的子串分为新的子串问题,从而可以通过迭代来解决, (3)构建左子树:主要就是指针的运用,获取前序遍历左子串的起始地址和子串长度,中序遍历左子串起始位置和根节点位置 root->left = ConstructCore(preStart+1,leftPreOrderEnd,  inStart,rootInorder-1); (4)同