二叉树的重建

class TreeNode {
	int val;
	TreeNode left;
	TreeNode right;
	TreeNode(int x) { val = x; }
}
/**
 * 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。
 * 假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
 * 例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},
 * 则重建二叉树并返回。
 * @author user
 *
 *
 *思路:前序遍历的第一个数据即为根节点的数据,则在中序遍历中进行扫描去找到根节点所在的位置,那么
 *根据中序遍历的特点,根节点之前即为树的左子树,之后即为右子树。同样前序遍历中根节点之后分别为左子树和右子树,
 *那么就可以找到左子树和右子树根节点。此时就可以使用递归了
 */
public class Solution {
    public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
    	//根节点
    	TreeNode rootNode = new TreeNode(pre[0]);
    	//判断前序遍历的长度
    	if(pre.length == 1) { //没有子树
    		rootNode.left = null;
    		rootNode.right = null;
    		return rootNode;
    	}
    	//获取根节点值,即前序遍历的第一个
    	int rootNodeVal = pre[0];
    	//在中序遍历中查找根节点的位置
    	int j;
    	for (j = 0; j < in.length; j++) {
			if(in[j] == rootNodeVal) break;
		}
    	//构建左子树
    	if(j > 0) { //判断是不是没有左子树
    		int[] preo = new int[j];
    		int[] ino = new int[j];
    		//获得左子树的前序遍历
    		for (int i = 0; i < j; i++) {
				preo[i] = pre[i+1];
			}
    		//获得左子树的中序遍历
    		for (int i = 0; i < j; i++) {
				ino[i] = in[i];
			}
    		//递归
    		rootNode.left = reConstructBinaryTree(preo, ino);
    	} else {
    		rootNode.left = null;
    	}
    	//构建右子树
    	if(pre.length - j - 1 > 0) { //判断是不是没有右子树
    		int[] preo = new int[pre.length - j - 1];
    		int[] ino = new int[pre.length - j - 1];
    		//获取右子树的前序遍历和中序遍历
    		for(int i = j + 1; i < pre.length; i++) {
				preo[i - j -1] = pre[i];
				ino[i - j -1] = in[i];
			}
    		//递归
    		rootNode.right = reConstructBinaryTree(preo, ino);
    	} else {
    		rootNode.right = null;
    	}
    	return rootNode;
    }
}
时间: 2024-10-31 04:30:52

二叉树的重建的相关文章

hihoCoder - 1049 - 后序遍历 (二叉树的重建!!)

#1049 : 后序遍历 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在参与过了美食节之后,小Hi和小Ho在别的地方又玩耍了一阵子,在这个过程中,小Ho得到了一个非常有意思的玩具--一棵由小球和木棍连接起来的二叉树! 小Ho对这棵二叉树爱不释手,于是给它的每一个节点都标记了一个标号--一个属于A..Z的大写字母,并且没有任意两个节点的标号是一样的.小Hi也瞅准了这个机会,重新巩固了一下小Ho关于二叉树遍历的基础知识~就这样,日子安稳的过了两天. 这天,小Ho正好

[树结构]二叉树的重建和序列化

二叉树的重建 几乎所有的人都知道二叉树可以根据前序遍历+中序遍历或者后序遍历+中序遍历的方式重新建立原来的二叉树,并且结果是唯一的.下面就来看一下相关的方法. 前序+中序重建二叉树 给定一棵二叉树的前序和中序遍历序列,重新建立这棵二叉树. 注意:在前序中确定了根节点以后,要去中序里面查找这个根节点,这时的查找没必要从数组的0下面开始,从这个树的中序的第一个点开始.然后查找的个数为停止的下表减去中序开始的下表. 这里重建二叉树用的是递归的方法,要注意递归的出口.不然会死循环. 所以代码实现: Tr

6-3 二叉树的重建 uva536

已知先序和中序  求后序 可以有两种方式输出 一种是建好树按照树输出 一种是不建树  在遍历的过程中存入vector  再倒叙输出 #include<bits/stdc++.h> using namespace std; int ri[1000];int le[1000]; char xian[30],zhong[30];vector<char>ans; int built(int x1,int y1,int x2,int y2) { if(x2>y2||x1>y1)r

【编程之美】java实现重建二叉树

package com.cn.binarytree.utils; /** * @author 刘利娟 [email protected] * @version 创建时间:2014年7月20日 下午2:03:30 类说明: */ class Node { Node left; Node right; char chValue; Node(char chValue) { left = null; right = null; this.chValue = chValue; } } public cla

利用层序遍历(不含None)和中序遍历重建二叉树 python

给定一颗二叉树的层序遍历(不含None的形式)和中序遍历序列,利用两个序列完成对二叉树的重建. 还是通过一个例子来说明整个过程,下图所示的二叉树,层序遍历结果为[a,b,c,d,e],中序遍历结果为[d,b,a,c,e],我们知道当我们找到根节点后,中序遍历能够提供给我们的信息就是左右子树分别包含哪些节点,而我们能否在层序遍历中找到根节点呢?很明显,层序遍历序列的第一个点是根节点,在中序遍历中找到左右子树分别包含哪些节点之后,我们就可以在层序遍历中区分出左右子树的层序遍历结果,然后就可以分别开始

递归重建二叉树的思路

(1)通过前序列表(根左右) 和 中序列表(左跟右)来重建二叉树 思路 前序遍历 序列中,第一个数字总是二叉树的根节点.在中序遍历 序列中,根节点的值在序列的中间,左子树的节点的值位于根节点的值的左边,右子树的节点的值位于根节点的值的右边.根据二叉树的这个性质,采用递归方法可以重建一个二叉树了. /** * Definition for binary tree * public class TreeNode { * int val; * TreeNode left; * TreeNode rig

二叉树学习(一)

树的基础知识 树的定义: 树包含n(n ≥≥ 0 )个节点,n = 0时称为空树. 在树的结构关系中,有且仅有一个节点没有前趋节点,这个节点称为树的根节点. 除根节点外,树中其他的节点有且仅有一个前趋节点,但可以有很多后继节点.如图,A为根节点. 树的基本术语: 结点的度:每个节点具有的子树的个数(后继节点的个数)称为该节点的度:A的度为3,B的度为0.(节点的度 = 节点的孩子节点 = 节点的后继节点) 树的度:树中所有节点的度的最大值:图中树的度为3.(树的度 取 所有节点度的最大值) 分枝

根据先序遍历和中序遍历建立二叉树

title: 根据先序遍历和中序遍历建立二叉树 date: 2019-07-23 22:37:34 tags: 数据结构 问题 已知一棵二叉树的先序遍历以及中序遍历,重建二叉树.二叉树的每一个节点有三个属性,左子节点,右子节点,以及节点值. 思路 先序遍历服从规则“根左右”,所以由此可知,对于一个先序遍历得到的数组,第一个元素一定是根节点: 中序遍历服从规则”左根右“,所以由此可知,对于一个中序遍历得到的数组,根节点左边的元素都属于根节点的左子树,而根节点右边的元素都属于根节点的右子树: 所以,

Pat(Advanced Level)Practice--1043(Is It a Binary Search Tree)

Pat1043代码 题目描述: A Binary Search Tree (BST) is recursively defined as a binary tree which has the following properties: The left subtree of a node contains only nodes with keys less than the node's key. The right subtree of a node contains only nodes