每日一题——洛谷 P1827 美国血统(4.12)

大家好呀,今天这道题考查的:二叉树遍历,我将和大家分享下前序+中序序如何推出后序,以及后序+中序推出前序


一、二叉树的遍历

  • 前序遍历:根节点——左子树——右子树
  • 中序遍历:左子树——根节点——右子树
  • 后序遍历:左子树——右子树——根节点
  • 层序遍历:从上到下从左到右,逐层遍历(借助队列实现)

二、例题

1.美国血统(前序+中序—>后序)

简单就是由二叉树的中序和前序遍历,求得该二叉树的后序遍历

  • AC代码

import java.util.Scanner;

/*
 * 中序遍历+前序遍历-->后序遍历
 */
public class Main{
	static String ldr,dlr;
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		ldr=sc.nextLine();//存放中序遍历
		dlr=sc.nextLine();//存放前序遍历
		int n=ldr.length();
		dfs(0,n-1,0,n-1);//前+中
	}
	private static void dfs(int a,int b,int a1,int b1) {
		if(a>b||a1>b1) {
			return;
		}
		char data=dlr.charAt(a);//根节点
		int index=ldr.indexOf(data);
		dfs(a+1,a+index-a1,a1,index-1);//递归遍历左子树
		dfs(index+a+1-a1,b,index+1,b1);//递归遍历右子树
		System.out.print(data);
	}
}

2.后序+中序–>前序

动手画下二叉树

  • AC代码
public class Main{
	static String ldr,lrd;
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		ldr=sc.nextLine();//存放中序遍历的结果
		lrd=sc.nextLine();//存放后序遍历的结果
		int n=ldr.length();
		dfs(n-1,0,n-1);
	}
	private static void dfs(int a,int x,int y) {
		if(x>y) {
			return;
		}
		char data=lrd.charAt(a);
		int index=ldr.indexOf(data);
		System.out.print(data);//输出根节点
		dfs(a+index-1-y,x,index-1);//递归左子树
		dfs(a-1,index+1,y);//递归右子树
	}
}

总结

  • 做题心得

做这道题的时侯,我先是在纸上模拟了如何通过前序+中序把二叉树还原,进而在得到后序遍历结果。就想到了可以用递归去解决,最重要的是递归中参数的变化,大家一定一定要动手去模拟,不要只停留再看。

  • 小小愿望

我是爬行系,有什么错误还希望指出哦,一起学习进步,可以点下关注哦,坚持每天一题!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

爬行系

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

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

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

打赏作者

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

抵扣说明:

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

余额充值