【LeetCode & 剑指offer刷题】树题8:26 树的子结构(572. Subtree of Another Tree)

【LeetCode & 剑指offer 刷题笔记】目录(持续更新中...)

572. Subtree of Another Tree

Given two non-empty binary trees s and t, check whether tree t has exactly the same structure and node values with a subtree of s. A subtree of s is a tree consists of a node in s and all of this node's descendants. The tree scould also be considered as a subtree of itself.
Example 1:
Given tree s:
  3
 / \
 4  5
/ \
1 2
Given tree t:
 4
/ \
1  2
Return true, because t has the same structure and node values with a subtree of s.
Example 2:
Given tree s:
     3
    / \
   4   5
  / \
 1  2
    /
   0
Given tree t:
 4
/ \
1 2
Return false.

 
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
/*
问题:判断某子树是否是主树的子结构
方法:前序遍历的递归方法
主树s, 子树t
*/
class Solution
{
public:
    bool isSubtree(TreeNode* s, TreeNode* t) //遍历主树s(前序遍历递归法)
    {
        if(s == nullptr) return false; //前序遍历递归的出口,注意一定要加判断空指针的语句,后面有s->left和s->right
       
        //前序遍历(递归法)主树t各结点,从根结点到左子树再到右子树(s一直在延伸,展开分支)
        if(isSame(s,t)) //判断当前结点下的子树是否一样
            return true; 
        else             //判断当前结点的左子树是否为子树t,再判断右子树是否为子树t
            return isSubtree(s->left, t) || isSubtree(s->right, t); 
    }
private:
    bool isSame(TreeNode* s, TreeNode* t) //确定s父结点后,开始同时扫描(递归法)s和t,看是各个结点是否相等
    {
        if(s == nullptr && t == nullptr) return true; //如果最后均遍历到空结点,返回true
        else if(s == nullptr || t == nullptr) return false; //如果一个遍历到空,一个没有,说明不同,返回false
       
        if(s->val == t->val)
        {
            return isSame(s->left, t->left) && isSame(s->right, t->right);
        }
        else
            return false; //不相同,返回假 
    }
};
 
 
 

 

posted @ 2019-01-05 19:44  wikiwen  阅读(247)  评论(0编辑  收藏  举报