镜子里的二叉树
Posted 航哥说JAVA
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了镜子里的二叉树相关的知识,希望对你有一定的参考价值。
什么是二叉树的镜像二叉树?
就是在和原二叉树是完全相反的,就像一个照镜子的人一样,你的左手就是镜子里的右手,如下,这两棵二叉树就互为镜像二叉树。
最直观的讲,镜像二叉树就是树上的每一个节点的左右子节点全部颠倒位置,那么就可以获取到这个二叉树的镜像二叉树。
那么,获取一颗树的镜像二叉树的方法就是,遍历这颗树,然后每个节点的左右子节点互换,就是这么简单。
互换左右子节点的位置
/**
* 交换输入节点的左右节点
*
* @param root 需要交换的节点
*/
private static void swapLeftAndRight(TreeNode root) {
TreeNode left = root.left;
root.left = root.right;
root.right = left;
}
那么,遍历一颗二叉树的方法,我上篇文章说过,一共有五种方式(文章链接,),我们只需要选择其中一种,把输出节点的值改为交换左右子节点即可。
当然,我们选择不同的遍历方式,交换的顺序是不一样的,但其实结果都一样。这里就不建议之字形遍历了,如果你这么交换,看到代码的人会认为你在炫技,没有什么意义。
下面这组图就是使用,前序遍历方式求镜像二叉树的过程,建议读者自己画出中序遍历交换的过程,以帮助自己更好的了解递归。
笔者这里使用了前序和层次遍历两种方式实现了代码
package com.darwin.algorithm.tree;
import com.darwin.algorithm.tree.util.TreeNode;
import com.darwin.algorithm.tree.util.TreeUtils;
import java.util.Deque;
import java.util.LinkedList;
import java.util.Objects;
/**
* 求一个二叉树的镜像二叉树
*
* @author yanghang
*/
public class MirrorTree {
public static void main(String[] args) {
TreeNode root = new TreeNode(1);
TreeNode t1 = new TreeNode(2);
TreeNode t2 = new TreeNode(3);
TreeNode t3 = new TreeNode(4);
TreeNode t4 = new TreeNode(5);
TreeNode t5 = new TreeNode(6);
TreeNode t6 = new TreeNode(7);
TreeNode t7 = new TreeNode(8);
TreeNode t8 = new TreeNode(9);
root.left = t1;
root.right = t2;
t1.left = t3;
t1.right = t4;
t2.left = t5;
t2.right = t6;
t4.left = t7;
t5.right = t8;
// TreeNode mirrorRootNode = mirrorTree(root);
TreeNode mirrorRootNode = mirrorTree(root);
TreeUtils.printTree(mirrorRootNode);
}
/**
* 获取一个二叉树的镜像二叉树(递归)
*
* @param root 二叉树的节点
* @return 交换后的二叉树节点
*/
public static TreeNode mirrorTree(TreeNode root) {
if (Objects.isNull(root)) {
return null;
}
// 交换左右节点
swapLeftAndRight(root);
mirrorTree(root.left);
mirrorTree(root.right);
return root;
}
/**
* 获取一个二叉树的镜像二叉树(队列)
*
* @param root 二叉树的节点
* @return 交换后的二叉树节点
*/
public static TreeNode mirrorTree2(TreeNode root) {
if (Objects.isNull(root)) {
return null;
}
Deque<TreeNode> deque = new LinkedList<>();
deque.add(root);
while (!deque.isEmpty()) {
TreeNode poll = deque.poll();
swapLeftAndRight(poll);
if (Objects.nonNull(poll.left)) {
deque.add(poll.left);
}
if (Objects.nonNull(poll.right)) {
deque.add(poll.right);
}
}
return root;
}
/**
* 交换输入节点的左右节点
*
* @param root 需要交换的节点
*/
private static void swapLeftAndRight(TreeNode root) {
TreeNode left = root.left;
root.left = root.right;
root.right = left;
}
}
什么是对称二叉树?
用大白话来说,镜像二叉树就是在中间画了一条线,对折过去,两边是可以重合的,那么就是对称二叉树。
那么如何判断一棵树是不是对称二叉树呢?我们可以使用两个指针a,b分别指向树的根节点的左右两个子节点,当a移动到左子节点的时候,b就移动到右子节点;当a移动到右子节点,b就移动到左子节点,然后判断a,b是不是同时为空或者值相同,不是的话,就不是对称二叉树。
检查过程如下
代码如下
class Solution {
public boolean isSymmetric(TreeNode root) {
if (Objects.isNull(root)) {
return true;
}
return isSymmetric(root.left, root.right);
}
public boolean isSymmetric(TreeNode left, TreeNode right) {
if (Objects.isNull(left) && Objects.isNull(right)) {
return true;
} else if (Objects.isNull(left) || Objects.isNull(right)) {
return false;
}
return left.val == right.val && isSymmetric(left.left, right.right) && isSymmetric(left.right, right.left);
}
}
...END...
好文推荐
......................更多精彩,等你白嫖......................
以上是关于镜子里的二叉树的主要内容,如果未能解决你的问题,请参考以下文章