判断B是 A的子树&&判断树是否对称


力扣这两算法的方法差不对,一并整理。

(一)判断B是否是A的子树

recur(A, B) 函数:

终止条件:
当节点 BB 为空:说明树 BB 已匹配完成,因此返回 true;
当节点 AA 为空:说明已经越过树 AA 叶子节点,即匹配失败,返回 false;
当节点 AA 和 BB 的值不同,返回 false ;
返回值:
判断 AA 和 BB 的左子节点是否相等,即 recur(A.left, B.left) ;
判断 AA 和 BB 的右子节点是否相等,即 recur(A.right, B.right) ;
isSubStructure(A, B) 函数:

特例处理: 当 树 AA 为空 或 树 BB 为空 时,直接返回 false ;
返回值: 若树 BB 是树 AA 的子结构,则必满足以下三种情况之一,因此用或 || 连接;
以 节点 AA 为根节点的子树 包含树 BB ,对应 recur(A, B);
树 BB 是 树 AA 左子树 的子结构,对应 isSubStructure(A.left, B);
树 BB 是 树 AA 右子树 的子结构,对应 isSubStructure(A.right, B);
以上 2. 3. 实质上是在对树 AA 做 先序遍历 .

bool isSubStructure(TreeNode* A, TreeNode* B) {
        //借用评论区和题解,用先序遍历A每个结点,判断它是否包含B的子树
        if(A==NULL||B==NULL) return false;
        return recur(A,B)||isSubStructure(A->left,B)||isSubStructure(A->right,B);

}
bool recur(TreeNode* A,TreeNode* B){//判断每个结点
        if(B==NULL) return true;
        if(A==NULL) return false;
        if(A->val!=B->val) return false;
        return bianli(A->left,B->left)&&bianli(A->right,B->right);
}

 (二)判断二叉树A是否对称

        

  1. 递归的函数要干什么?
  • 函数的作用是判断传入的两个树是否镜像。
  • 输入:TreeNode left, TreeNode right
  • 输出:是:true,不是:false
  1. 递归停止的条件是什么?
  • 左节点和右节点都为空 -> 倒底了都长得一样 ->true
  • 左节点为空的时候右节点不为空,或反之 -> 长得不一样-> false
  • 左右节点值不相等 -> 长得不一样 -> false
  1. 从某层到下一层的关系是什么?
  • 要想两棵树镜像,那么一棵树左边的左边要和二棵树右边的右边镜像,一棵树左边的右边要和二棵树右边的左边镜像
  • 调用递归函数传入左左和右右
  • 调用递归函数传入左右和右左
  • 只有左左和右右镜像且左右和右左镜像的时候,我们才能说这两棵树是镜像的
  1. 调用递归函数,我们想知道它的左右孩子是否镜像,传入的值是root的左孩子和右孩子。这之前记得判个root==null。

代码如下:

bool isSymmetric(TreeNode* root) {
        if(root==NULL) return true;
        return isduichen(root->left,root->right);
}
bool isduichen(TreeNode* A,TreeNode* B){ //比较左子树与右子树是否对称,
        if(A==NULL&&B==NULL) return true;
        if(A==NULL||B==NULL) return false;
        if(A->val!=B->val) return false;
        return isduichen(A->left,B->right)&&isduichen(A->right,B->left);
}

相关