剑指26 树的子结构

输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)

B是A的子结构, 即 A中有出现和B相同的结构和节点值。

例如:
给定的树 A:

     3
    / \
   4   5
  / \
 1   2
给定的树 B:

   4 
  /
 1
返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。

示例 1:

输入:A = [1,2,3], B = [3,1]
输出:false
示例 2:

输入:A = [3,4,5,1,2], B = [4,1]
输出:true

 

递归求解,关键还是检查代码的鲁棒性。

做题时忘记对B==nullptr做判断,只在checksame里面做了判断,但是没有注意findbegin也需要做判断。

 1 /**
 2  * Definition for a binary tree node.
 3  * struct TreeNode {
 4  *     int val;
 5  *     TreeNode *left;
 6  *     TreeNode *right;
 7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 8  * };
 9  */
10 class Solution {
11 public:
12     bool isSubStructure(TreeNode* A, TreeNode* B) {
13         if(B==nullptr)
14             return false;
15         return findbegin(A,B);
16     }
17 
18     bool findbegin(TreeNode* A, TreeNode* B){
19         if(A==nullptr)
20             return false;
21         return ((A->val==B->val)&&checksame(A,B))
22             |findbegin(A->left,B)|findbegin(A->right,B);
23     }
24 
25     bool checksame(TreeNode* base, TreeNode* sub){
26         if(base==nullptr && sub==nullptr)
27             return true;
28         if(base==nullptr)
29             return false;
30         if(sub==nullptr)
31             return true;
32         if(base->val!=sub->val)
33             return false;
34         return true&checksame(base->left,sub->left)&checksame(base->right,sub->right);
35     }
36 };

 

posted @ 2020-07-04 08:58  __rookie  阅读(118)  评论(0编辑  收藏  举报