递归和迭代方式判断二叉树是否镜像对称小结

 二叉树的一些问题,一般都能采用递归和迭代两种方式去解决。
首先,

***方式一:递归。
采用递归解决问题,通常我们可以分解出三个角度去得出解题思路。
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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值