您的位置:首页 > 其它

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

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  二叉树 遍历