判断二叉树是否对称
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就比较好理解了。