leetcode C语言版 572. 另一个树的子树

给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树。s 的一个子树包括 s 的一个节点和这个节点的所有子孙。s 也可以看做它自身的一棵子树。

示例 1:
给定的树 s:

     3
    / \
   4   5
  / \
 1   2

给定的树 t:

   4 
  / \
 1   2

返回 true,因为 t 与 s 的一个子树拥有相同的结构和节点值。

示例 2:
给定的树 s:

     3
    / \
   4   5
  / \
 1   2
    /
   0

给定的树 t:

   4
  / \
 1   2

返回 false

分析:

首先判断头节点是不是相同,不同的话就判断左或者右节点是否相同,如果都相同那么返回true,否则递归判断s->left和s->right与t是否匹配,成功返回true,失败返回false。

注意:

在leetcode里面,C语言写的函数应该写在调用之前,否则编译不通过。

在进行递归判断的时候,参数 s 应该一次改变为左右节点,而 t 应该还是 t ,不能习惯性的写出 t 的左右节点。

bool isSame(struct TreeNode *s,struct TreeNode *t){
    if(!s&&!t)
        return true;
    if(!s||!t)
        return false;
    if(s->val == t->val){
        bool left = isSame(s->left,t->left);
        bool right = isSame(s->right,t->right);
        if(left && right)
            return true;
    }
    return false;
}

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
bool isSubtree(struct TreeNode* s, struct TreeNode* t) {
    if(!s && !t)
        return true;
    if(!s || !t)
        return false;
    if(s->val == t->val && isSame(s,t)){
        return true;
    }else{
        bool left = isSubtree(s->left,t);
        if(left)
            return true;
        bool right = isSubtree(s->right,t);
        if(right)
            return true;
        return false;
        // if(left || right)
            // return true;
        // return false;
    }
    return false;
}

函数的递归部分,用了两个判断语句,而没有将两句递归写在一起是为了减少递归次数,因为如果左子树递归返回true,那么就没有必要再递归右子树了。如果不理解可以将isSubtree()函数的else部分改写成如下代码:

bool left = isSubtree(s->left,t);
bool right = isSubtree(s->right,t);
if(left || right)
   return true;
return false;



猜你喜欢

转载自blog.csdn.net/Random_R/article/details/80948144