Leetcode--树的子结构

输入两棵二叉树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
限制:

0 <= 节点个数 <= 10000

思路

条件判断上的思路:

如果A和B都为空、A不为空但B为空, 说明B之前的节点值都在A上找到了对应的, 所以返回true;

如果A为空但B不为空, 说明B后面的值在A的这个方向上不会有相应的值, 所以返回false

/**
 * 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:
    TreeNode* BTemp;
    bool readTree(TreeNode* A, TreeNode* B){
        // A和B都为空, A不为空但B为空
        if((!A&& !B) ||(A&& !B))
            return true;
        // A为空但B不为空
        if(!A && B)
            return false;

        if(A->val == B->val)
            // A的节点值和B的节点值相等,同时将A和B向同一个方向的子节点推
            return readTree(A->left, B->left) && readTree(A->right, B->right);
        else{
            // 将B还原为原始的根节点,主要是处理[3,4,5,1,2], [3,1]这种断层相等的情况
            // 只要A与B的节点值不相等,都得从B的根节点开始比较
            B= BTemp;
            // A的节点值和B的节点值不相等, 只将A往子节点推
            return readTree(A->left, B) || readTree(A->right, B);
        }
    }
    bool isSubStructure(TreeNode* A, TreeNode* B) {
        if(!A|| !B)
            return false;

        BTemp= B;
        return readTree(A, B);
    }
};
发布了184 篇原创文章 · 获赞 25 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/weixin_41879093/article/details/105202114