【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   s could 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 ; //不相同,返回假 
    }
};
 
 
 

猜你喜欢

转载自www.cnblogs.com/wikiwen/p/10225819.html