前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【leetcode刷题】T144-另一个树的子树

【leetcode刷题】T144-另一个树的子树

作者头像
木又AI帮
发布2019-08-21 22:35:31
4360
发布2019-08-21 22:35:31
举报
文章被收录于专栏:木又AI帮木又AI帮木又AI帮

【题目】

给定两个非空二叉树 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。

【思路】

(昨天才说递归很简单,今天就没做出来。。。大概思路是对的,没调通)

写两个递归函数方便理解点。

第一个递归函数主要找到s中和t根节点值相同的节点;

第二个递归函数主要判断s中某个子树是否和t完全相同。

【代码】

python版本

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):        
    def isSubtree(self, s, t):
        """
        :type s: TreeNode
        :type t: TreeNode
        :rtype: bool
        """
        if not s and t:
            return False
        # 树是否相同
        if self.is_same(s, t):
            return True
        # 不同则继续遍历孩子节点
        return self.isSubtree(s.left, t) or self.isSubtree(s.right, t)

    def is_same(self, s, t):
        if not s and not t:
            return True
        if not s or not t:
            return False
        if s.val != t.val:
            return False

        return self.is_same(s.left, t.left) and self.is_same(s.right, t.right)

C++版本

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    bool isSubtree(TreeNode* s, TreeNode* t) {
        if(not s and t)
            return false;
        if(is_same(s, t))
            return true;
        return isSubtree(s->left, t) || isSubtree(s->right, t);
    }

    bool is_same(TreeNode* s, TreeNode* t){
        if(not s and not t)
            return true;
        if(not s or not t)
            return false;
        if(s->val != t->val)
            return false;
        return is_same(s->left, t->left) && is_same(s->right, t->right);
    }
};
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-08-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 木又AI帮 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档