二叉树的一些问题,一般都能采用递归和迭代两种方式去解决。
首先,
***方式一:递归。
采用递归解决问题,通常我们可以分解出三个角度去得出解题思路。
1.明确递归结束条件
2.明确递归过程
3.明确短路的条件***
现在我们针对判断二叉树是否镜像对称的问题,套用一下。
题目描述:
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [1,2,2,3,4,4,3] 是对称的。
1
/ |
2 2
/ \ / |
3443
但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:
1
/ 、
2 2
\ 、
3 3
/**
-
Definition for a binary tree node.
-
public class TreeNode {
-
int val;
-
TreeNode left;
-
TreeNode right;
-
TreeNode(int x) { val = x; }
-
}
*/
class Solution {
public boolean isSymmetric(TreeNode root) {}
}
思路:
递归结束条件:
*如果根节点为null 则返回true;
*A节点为null &&B节点为null 则返回true;
*如果A或者B其中一个为null,则返回false;
递归过程:
*判断A,B的val值是否相等。
*判断 A 的右子树与 B 的左子树是否对称
*判断 A 的左子树与 B 的右子树是否对称
短路条件:
在递归判断过程中存在短路现象,也就是做 与 操作时,如果前面的值返回 false 则后面的不再进行计算
主要代码实现:
public boolean isSymmetric(TreeNode root){
if(root==null) return true;
return isMirror(TreeNode A,TreeNode B);
}
public boolean isMirror(TreeNode A,TreeNode B){
if(A==null&&B==null) return true;
if(A==null||B==null) return false;
return (A.val==B.val)&&isMirror(A.left,B.right)&&isMirror(A.right,B.right);
}
复杂度分析
时间复杂度:O(n),因为我们遍历整个输入树一次,所以总的运行时间为 O(n),其中 n 是树中结点的总数。
空间复杂度:递归调用的次数受树的高度限制。在最糟糕情况下,树是线性的,其高度为 O(n)。因此,在最糟糕的情况下,由栈上的递归调用造成的空间复杂度为 O(n)。此处存疑。
方式二:迭代。
思路:
除了递归的方法外,我们也可以利用队列进行迭代
主要就是保证队列中需要比对的两个值连续。每次取出两个值进行比较,如不相等,或者队列为空时,结束迭代。
具体来说,队列中每两个连续的结点应该是相等的,而且它们的子树互为镜像。最初,队列中包含的是 root 以及 root。每次提取两个结点并比较它们的值。然后,将两个结点的左右子结点按相反的顺序插入队列中。当队列为空时,或者我们检测到树不对称(即从队列中取出两个不相等的连续结点)时,该算法结束。
主要代码实现:
public boolean isSymmetric(TreeNode root){
//创建一个对列
Queue<TreeNode> queue = new LinkedList<>();
//最开始比对根节点,主要是提取一个通用代码。
queue.add(root);
queue.add(root);
//主要代码,迭代,迭代前提条件,对列非空。
while(!queue.isEmpty()){
//对列中取出两个连续的节点。
TreeNode A = queue.poll();
TreeNode B = queue.poll();
if(A==null&&B==null) return continue;
if(A==null||B==null) return false;
if(A.val!=B.val) return false;
//将两个结点的左右子结点按相反的顺序插入队列中
queue.add(A.left);
queue.add(B.right);
queue.add(A.right);
queue.add(B.left);
}
return true;
}
复杂度分析
时间复杂度:O(n),因为我们遍历整个输入树一次,所以总的运行时间为 O(n),其中 n 是树中结点的总数。
空间复杂度:搜索队列需要额外的空间。在最糟糕情况下,我们不得不向队列中插入 O(n)个结点。因此,空间复杂度为 O(n).
参考文档:https://leetcode-cn.com/problems/symmetric-tree/solution/dui-cheng-er-cha-shu-by-leetcode/