二叉树镜像问题——Offer. 27&28
Posted Mirror559
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树镜像问题——Offer. 27&28相关的知识,希望对你有一定的参考价值。
剑指 Offer 27. 二叉树的镜像 - 力扣(LeetCode) (leetcode-cn.com)
剑指 Offer 28. 对称的二叉树 - 力扣(LeetCode) (leetcode-cn.com)
这两题都是有关二叉树的镜像问题。
我刚开始的思路是,使用BFS遍历二叉树,将每一层存到一个LinkedList中,按照层对二叉树进行镜像操作。
public void test(TreeNode root) if (root == null) return true; LinkedList<TreeNode> queue1 = new LinkedList<>(), queue2 = new LinkedList<>(); queue1.offerLast(root); while (!queue1.isEmpty() || !queue2.isEmpty()) if (!queue1.isEmpty()) //镜像操作 function(queue1, queue2); else //镜像操作 function(queue2, queue1); public void function(LinkedList<TreeNode> queueOut, LinkedList<TreeNode> queueIn) TreeNode temp = null; while (!queueOut.isEmpty()) temp = queueOut.pollFirst(); if (temp == null) continue; queueIn.offerLast(temp.left); queueIn.offerLast(temp.right);
做Offer28的时候,这个方法的时间、空间开销感觉已经接近于无法通过了,于是开始思考递归的做法。
我刚开始使用的错误递归,是把二叉树的镜像问题想成了一个全局的递归问题,即:
- 二叉树本身是镜像的
- 二叉树的左右子树也都是镜像的
这就导致了在二叉树的镜像问题上,我的思路全部错误。
正确的镜像二叉树的定义是:
- 二叉树为空树
- 不为空树,则有:
- left.left == right.right
- left.right == right.left
由此,二叉树的镜像问题就转化为了非常标准的递归解法。
public boolean isSymmetric(TreeNode root) if (root == null) return true; return dfs(root.left, root.right); public boolean dfs(TreeNode left, TreeNode right) if (left == null && right == null) return true; if (left == null && right != null) return false; if (left != null && right == null) return false; return left.val == right.val && dfs(left.left, right.right) && dfs(left.right, right.left);
以上是关于二叉树镜像问题——Offer. 27&28的主要内容,如果未能解决你的问题,请参考以下文章
剑指 Offer 26. 树的子结构 / 剑指 Offer 27. 二叉树的镜像 / 剑指 Offer 28. 对称的二叉树 / 剑指 Offer 29. 顺时针打印矩阵