镜子里的二叉树

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...



好文推荐








......................更多精彩,等你白嫖......................