二叉树之镜像树

  • 前言
  • 一、镜像树是什么?
  • 二、镜像树的应用场景
  • 三、如何确认这是一颗镜像树
  • 四、复习二叉树的遍历方式



前言

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


一、镜像树是什么?

镜像树,直白的一点理解就是,在中间放置一面镜子,镜子里镜子外是对称的关系。让我不禁想到了平面镜成像

云平台镜像节点 镜像节点是什么_后序


镜像树无非就是A、B、C有一个树状的关系,头的镜像就是自身

云平台镜像节点 镜像节点是什么_云平台镜像节点_02


简单再解释一下:

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

二、镜像树的应用场景

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

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


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

刚说到应用场景是刷题,这就是力扣的原题,具体题目描述我就不贴出来了,有需要可以点下面的链接去做做看,大致上意思就是给你一个树的头节点,你填充一下这个方法,让这个方法

101. 对称二叉树剑指 Offer 28. 对称的二叉树

云平台镜像节点 镜像节点是什么_云平台镜像节点_03


不着急写代码,先考虑一下一个节点咋判断是不是镜像(对称)的

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

假设我们有这么一个方法,可以判断一个节点是否是镜像的,那么我们不是只要一层层递归进去不就可以得到整棵树是否是镜像的这个方法了吗?

云平台镜像节点 镜像节点是什么_后序_04


下面是写法:

  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);
	}