【好记性不如烂笔头】二叉树之镜像树


前言

上次记录了二叉树的遍历方式,这次记录一下二叉树的镜像树,个人不喜欢字太多的,看着烦,通篇尽量还是用画图的方式记录。


一、镜像树是什么?

镜像树,直白的一点理解就是,在中间放置一面镜子,镜子里镜子外是对称的关系。让我不禁想到了平面镜成像
平面镜成像
镜像树无非就是A、B、C有一个树状的关系,头的镜像就是自身
镜像树
简单再解释一下:

C节点:C是根节点,C的镜像节点就是C‘
B节点:C的左节点B = C'的右节点B‘
A节点:B的左节点A = B‘的右节点A’  且 B的右节点null = B’的左节点

二、镜像树的应用场景

目前大多都是在哪遇到的:刷题

具体的应用场景我也还没有遇到,这里留个记录,以后遇到了再补充进来


三、如何确认这是一颗镜像树

刚说到应用场景是刷题,这就是力扣的原题,具体题目描述我就不贴出来了,有需要可以点下面的链接去做做看,大致上意思就是给你一个树的头节点,你填充一下这个方法,让这个方法
101. 对称二叉树
剑指 Offer 28. 对称的二叉树
在这里插入图片描述
不着急写代码,先考虑一下一个节点咋判断是不是镜像(对称)的

我怀里有俩孩子,左边的孩子和右边的孩子一样
head.left == head.right

假设我们有这么一个方法,可以判断一个节点是否是镜像的,那么我们不是只要一层层递归进去不就可以得到整棵树是否是镜像的这个方法了吗?
在这里插入图片描述
下面是写法:

  1. 初始根节点,自己跟自己比
  2. 先判断边界条件:
    2.1 两个节点有一个不为空,一个为空,直接返回false.
    2.2 两个节点都是空的,那还不直接返回true。
  3. 在判断两个节点的值是否一样,如果一样往下递归进行。
	public boolean isSymmetric(TreeNode root) {
        return isSameNode(root,root);
    }
	
	public static boolean isSameNode(TreeNode p, TreeNode q) {
		
		if (p == null ^ q == null) {
			return false;
		}
		
		if (p == null && q == null) {
			return true;
		}
		
		return p.val == q.val && isSameNode(p.left, q.right) && isSameNode(p.right, q.left);
	}

四、复习二叉树的遍历方式

上次写了二叉树的遍历方式:先序、中序、后序
先序:先头再左再右
中序:先左再头再右
后序:先左再右再头
后来写出打印代码后,提出了一个递归序:每一个节点进去3次。
在第一次打印结果,就是先序
在第二次打印结果,就是中序
在第三次打印结果,就是后序

再次手写一下递归序代码:

	public void ds(TreeNode head){
		//边界条件
		if(head==null){
			return;
		}
		//第一次进head节点
		System.out.println("我是先序:"+head.val);
		ds(head.left);
		//第二次进head节点
		System.out.println("我是中序:"+head.val);
		ds(head.right);
		//第三次进head节点
		System.out.println("我是后序:"+head.val);
	}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

泪梦殇雨

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

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

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

打赏作者

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

抵扣说明:

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

余额充值