二叉树的重建

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树的重建相关的知识,希望对你有一定的参考价值。

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;
    }
}


本文出自 “12212886” 博客,请务必保留此出处http://12222886.blog.51cto.com/12212886/1963601

以上是关于二叉树的重建的主要内容,如果未能解决你的问题,请参考以下文章

递归重建二叉树的思路

知道二叉树的先序和中序遍历,重建该二叉树

二叉树的重建

输入某二叉树的前序遍历和中序遍历的结果,重建出该二叉树

二叉树的重建

题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树