二叉树:对称二叉树

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;
    }
}
posted @ 2021-04-24 14:21  当康  阅读(425)  评论(0编辑  收藏  举报