0
点赞
收藏
分享

微信扫一扫

二叉树 | 判断二叉树是否对称

古月无语 2022-05-01 阅读 114
算法

判断二叉树是否对称

1. 题目

牛客BM31:给你二叉树的根节点root,判断该二叉树是否对称

2. 思路

递归,对比左右子树

  • 左子树的左子树 ?= 右子树的右子树
  • 左子树的右子树 ?= 右子树的左子树
    在这里插入图片描述

核心步骤:对比两棵子树

伪代码
令两棵子树的根节点分别为a, b(共4种情况)

  • ① 若a, b结点都为空,则两子树相等
  • ② 若a, b结点其中一个不为空,则两子树一定不相等
  • ③ 若a, b结点都不空,但结点的值不相等,则两子树一定不相等
  • ④ 若a, b结点都不为空且两结点的值相等,则向下递归判断

流程图(共4种情况)
在这里插入图片描述

3. 代码

3.1 流程图版

    public boolean isSymmetrical(TreeNode pRoot) {//二叉树是否对称
    	if(pRoot == null) return true;//根节点为空,一定对称
    	return IsEquals(pRoot.left, pRoot.right);//比较左右两棵子树
    }//isSymmetrical

    public static boolean IsEquals(TreeNode a, TreeNode b) {//两棵树是否相等
    	if(a == null && b == null) {//情况1
    		return true;
    	}else if((a == null && b != null) || (a != null && b == null)) {//情况2
    		return false;
    	}else if(a.val == b.val) {//情况3
    		boolean outside = IsEquals(a.left, b.right);
    		boolean inside = IsEquals(a.right, b.left);
    		return outside && inside;
    	}else {//情况4
    		return false;
    	}
    }//IsEquals

3.2 精简版

    public boolean isSymmetrical(TreeNode pRoot) {//二叉树是否对称
    	if(pRoot == null) return true;//根节点为空,一定对称
    	return IsEquals(pRoot.left, pRoot.right);//比较左右两棵子树
    }//isSymmetrical

    public static boolean IsEquals(TreeNode a, TreeNode b) {//判断ab两棵子树是否相等
    	if(a == null && b == null) return true;//情况1
    	if(a == null || b == null) return false;//情况2
    	if(a.val != b.val) return false;//情况4
    	//情况3
    	boolean outside = IsEquals(a.left, b.right);
    	boolean inside = IsEquals(a.right, b.left);
    	return outside && inside;
    }//check

补充:

可能会有同学对情况1情况2中if的判断条件有疑问,(A &&B) 不是包含 (A || B) 吗?为什么可以分开写?因为如果满足 (A &&B) 的话,那就会走情况1的处理流程;如果不满足 (A &&B) ,那就是剩下3种情况,所以可以用 (A || B)的判断语句走情况2的处理流程;剩下的情况3情况4就比较好理解了。

举报

相关推荐

对称二叉树

0 条评论