【好记性不如烂笔头】二叉树之利用先序中序还原树


前言

之前进行了二叉树的先序中序后序打印,那么反过来怎么把先序中序还原出二叉树呢?


一、二叉树示例

在这里插入图片描述

二、思路

写一下节点信息

先序+中序:pre + in
head = pre[0] = in[3] ;
head.left = pre[1 … 3] = pre[1] = in[0 … 2] = in[1]
head.left.left = pre[2] = in[0]
head.left.right = pre[3] = in[2]
head.right = pre[4 … 6] = pre[4] = in[4 … 6] = in[5]
head.right.left = pre[5] = in[4]
head.right.right = pre[6] = in[6]

考虑递归实现

假设有一个函数f(int[]pre,int l1,int r1,int[]in,int l2,int r2) 可以把先序l1-r1位置,中序l2-r2位置合并出一个TreeNode节点,画出递归的操作逻辑
在这里插入图片描述

public TreeNode f(int[] pre, int L1, int R1, int[] in, int L2, int R2){
	    //终止条件
	    //1. null终止
	    if(L1>R1){
	        return null;
	    }
	    TreeNode head = new TreeNode(pre[L1]);
	    //2. 碰撞终止
	    if(L1==R1){
	        return head;
	    }
	    // find是移动的,找到当前头
	    int find = L2;
	    while (in[find] != pre[L1]) {
	            find++;
	    }
	    //左节点
	    head.left = f(pre, L1 + 1, L1 + find - L2, in, L2, find - 1);
	    //右节点
	    head.right = f(pre, L1 + find - L2 + 1, R1, in, find + 1, R2);
	    return head;
	}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

泪梦殇雨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值