剑指offer之编程(四)

题目描述:

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回后续遍历。

思路:很典型的知道前序和中序求整个二叉树的题目,首先看前序遍历,根据前序遍历的规则可以知道,第一个元素时二叉树的根节点,其他的元素则为子数的根节点。通过前序遍历的节点,在中序遍历中找到该节点,那么,这个节点的左边就是这棵树的左子树,右边是这棵树的右子树。例如:前序遍历的第一个元素为1,那么在中序遍历中找到1,那么这棵树的左子树的元素为{4,7,2},右子树的元素为{5,3,8,6},那么下面就可以递归地求解各个子树了,例如对于左子树{4,7,2},在前序遍历中按次序找到2,那么这可子树的左子树是{4,7},右子树为{},即为空。按照这种方法递归地找下去,那么就可以建立一个二叉树。下面的代码是输出后序遍历的代码,层次输出的话修改一下输出语句。


代码如下:

import java.util.*;

public class Main10 
{

	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};
        solve(pre, in);
	}
	
	public static void solve(int []pre,int []in)  //pre为前序遍历,in为中序遍历
	{
		if(pre.length<1)  //没有元素就返回
		{
			return;
		}
		else if(pre.length==1)  //只有一个元素
		{
			System.out.println(pre[0]);  //输出这个元素
		}
		else
		{
			//在中序中找到当前根节点位置
			int index = 0;
			for(int i=0;i<in.length;i++)
			{
				if(pre[0]==in[i])
				{
					index = i;
				}
			}
			
			//左半部分的前序
			int [] leftPre = new int[index];
			System.arraycopy(pre, 1, leftPre, 0, index);
			
			//右半部分的前序
			int len = pre.length-index-1;
			int [] rightPre = new int[len];
			System.arraycopy(pre, index+1, rightPre, 0, len);
			
			//左边部分的中序
			int [] leftIn = new int[index];
			System.arraycopy(in, 0, leftIn, 0, index);
			
			//左半部分的中序
			int rlen = in.length-index-1;
			int [] rightIn = new int[rlen];
			System.arraycopy(in, index+1, rightIn, 0, rlen);
			
			//递归地求解左右子树
			solve(leftPre, leftIn);
			solve(rightPre, rightIn);
			
			System.out.println(pre[0]);  //输出根
			
		}
	}

}

class TreeNode  //树节点的类
{
	int data;
	TreeNode leftNode;
	TreeNode rightNode;
	
	public TreeNode(int data)
	{
		this.data = data;
	}
	
}

可能还有其他比较好的方法,还望不惜吝教。

本人经验,仅供参考!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值