加载中...

[leetcode]第 7 天 搜索与回溯算法(简单)

26. 树的子结构

思路

不知道。。看大佬的题解
流程:

  1. 先判断B是不是以A节点为根节点的一个子树
    如果不是,判断B是否是A左右子树的一个子结构
  2. isSubTree(Ta, Tb)
    判断Tb是否是以Ta为根节点的子树
class Solution {
    public boolean isSubStructure(TreeNode A, TreeNode B) {
      // 先判断特殊情况
      if(A == null || B == null){
        return false;
      }
      
      // 判断是否是以A为根节点的一个子树
      if(isSubTree(A, B)){
        return true;
      }
      
      if(isSubStructure(A.left, B) || isSubStructure(A.right, B)){
        return true;
      }
      return false;
    }
    
     public boolean isSubTree(TreeNode Ta, TreeNode Tb){
    // 判断一下B的节点是不是已经检查完了
      if(Tb == null){
        return true;
      }
      
       if(Ta == null){
        return false;
      }

        if(Ta.val != Tb.val){
         return false;
      }
      return isSubTree(Ta.left, Tb.left) && isSubTree(Ta.right, Tb.right);
    }
}

27. 二叉树的镜像

思路

用递归的话要先保存左右子节点,然后进行交换

class Solution {
    public TreeNode mirrorTree(TreeNode root) {
        if (root == null) return null;
        TreeNode leftRoot = mirrorTree(root.right);
        TreeNode rightRoot = mirrorTree(root.left);
        root.left = leftRoot;
        root.right = rightRoot;
        return root;
    }
}

28. 对称的二叉树

思路

对于树中任意两个对称节点L和R:
L.val = R.val
L.left.val = R.left.val
L.right.val = R.right.val

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);
    }
}

递归,需要想清楚结束条件、递归条件。

posted @ 2022-12-27 18:05  Vincy9501  阅读(15)  评论(0编辑  收藏  举报