剑指 offer || 重建二叉树

题目描述

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

解题思路

    (1)明白什么是前序遍历和中序遍历

        前序遍历:根--左--右

        中序遍历:左--中--右

   (2)知道前序遍历和中序遍历怎么确定一颗二叉树

           1)确定根结点,在前序遍历中第一个节点即为根结点root。

           2)根据第一步确定的根结点,在中序中找到根结点root所在的位置,root的左侧即为左节点leftNode、右侧即为右节点rightNode。

          3)分别对第二步确定的左节点和右节点一次进行前两步的操作,直到遍历到左右节点的叶子结点为止。

代码实现

public static TreeNodee reConstructBinaryTree(int[] pre, int[] middle){
		
		TreeNodee root = new TreeNodee(pre[0]);
		int length = pre.length;
		//只有一个元素
		if(length == 0) {
			root.left = null;
			root.right = null;
			return root;
		}
		//中序中确定根元素
		int i;
		int rootval = root.val;
		
		System.out.println(rootval);
		
		for(i = 0; i < length; i++) {
			if(rootval == middle[i]) {
				break;
			}
		}
		//构建左子树
		if(i > 0) {
			int[] press = new int[i];
			int[] middless = new int[i];
			
			for(int j = 0; j < i; j++) {
				press[j] = pre[j+1];
			}
			
			for(int j = 0; j < i; j++) {
				middless[j] = middle[j];
			}
			
			root.left = reConstructBinaryTree(press, middless);
		}else {
			root.left = null;
		}
		
		//构建右子树
		if(length-i-1 > 0) {
			int[] pres = new int[length-i-1];
			int[] middles = new int[length-i-1];
			
			for(int j = i+1; j<length; j++) {
				pres[j-i-1] = pre[j];
				middles[j-i-1] = middle[j];
			}
			
			root.right = reConstructBinaryTree(pres, middles);
			
		}else {
			root.right = null;
		}
		return root;
	}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值