二叉树:对称二叉树
101. 对称二叉树
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [1,2,2,3,4,4,3] 是对称的。
1
/ \
2 2
/ \ / \
3 4 4 3
但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:
1
/ \
2 2
\ \
3 3
思路
我们要比较的是两个树(这两个树是根节点的左右子树)。
递归法
1.确定递归函数的参数和返回值
- 因为要比较的是两个树,参数自然也是左子树节点和右子树节点
- 返回值是bool类型
2.确定终止条件
节点为空的情况有:
- 左节点为空,右节点不为空,不对称,return false
- 左不为空,右为空,不对称 return false
- 左右都为空,对称,返回true
左右节点不为空:
- 左右都不为空,比较节点数值,不相同就return false
3.确定单层递归的逻辑
单层递归的逻辑就是处理左右节点都不为空,且数值相同的情况。
- 比较二叉树外侧是否对称:传入的是左节点的左孩子,右节点的右孩子
- 比较内侧是否对称,传入左节点的右孩子,右节点的左孩子
- 如果左右都对称就返回true ,有一侧不对称就返回false
代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public boolean isSymmetric(TreeNode root) {
return root == null ? true : recur(root.left, root.right);
}
boolean recur(TreeNode L, TreeNode R) {
if(L == null && R == null) return true;
if(L == null || R == null || L.val != R.val) return false;
return recur(L.left, R.right) && recur(L.right, R.left);
}
}
572. 另一个树的子树
给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树。s 的一个子树包括 s 的一个节点和这个节点的所有子孙。s 也可以看做它自身的一棵子树。
给定的树 s:
3
/ \
4 5
/ \
1 2
给定的树 t:
4
/ \
1 2
思路
判断 t 是否和树 s 的任意子树相等。
代码
class Solution {
//判断t是否是s的子树
public boolean isSubtree(TreeNode root, TreeNode subRoot) {
if(root == null && subRoot == null) return true;
if(root == null && subRoot != null) return false;
return compare(root, subRoot) || isSubtree(root.left, subRoot) || isSubtree(root.right, subRoot);
}
//判断t是否与s相同
public boolean compare(TreeNode left,TreeNode right){
// 首先排除空节点的情况
if(left == null && right != null) return false;
else if(left != null && right == null) return false;
else if(left == null && right == null) return true;
// 排除了空节点,再排除数值不相同的情况
else if(left.val != right.val) return false;
// 此时就是:左右节点都不为空,且数值相同的情况
boolean outside = compare(left.left,right.left);
boolean inside = compare(left.right,right.right);
return outside && inside;
}
}