31天剑指offer (7/31)搜索与回溯算法

剑指 Offer 26. 树的子结构

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

B是A的子结构, 即 A中有出现和B相同的结构和节点值。
在这里插入图片描述

示例 1:

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

输入:A = [3,4,5,1,2], B = [4,1]
输出:true
/**
 * 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 isSubStructure(TreeNode* A, TreeNode* B) {
    
    
        if(A==NULL||B==NULL) return false;
        else if(A->val==B->val && jud(A->left,B->left) && jud(A->right,B->right))
        {
    
    
            return true;
        }
        else return isSubStructure(A->left,B)||isSubStructure(A->right,B); 
    }
    bool jud(TreeNode* a,TreeNode* b)
    {
    
    
        if(b==NULL) return true;
        if(a==NULL) return false;
        if(a->val!=b->val) return false;
        else return jud(a->left,b->left) && jud(a->right,b->right);
    }
};

剑指 Offer 28. 对称的二叉树

请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。
在这里插入图片描述

示例 1:

输入:root = [1,2,2,3,4,4,3]
输出:true

示例 2:

输入:root = [1,2,2,null,3,null,3]
输出: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:
    bool compare(TreeNode* l,TreeNode* r)
    {
    
    
        if(l==NULL&&r==NULL) return true;
        else if(l==NULL&&r!=NULL) return false;
        else if(l!=NULL&&r==NULL) return false;
        else if(l->val!=r->val) return false;
        else return compare(l->left,r->right)&&compare(r->left,l->right);
    }
    bool isSymmetric(TreeNode* root) {
    
    
        if(root==NULL) return true;
        return compare(root->left,root->right);

    }
};

剑指 Offer 27. 二叉树的镜像

请完成一个函数,输入一个二叉树,该函数输出它的镜像。

在这里插入图片描述

示例 1:

输入:root = [4,2,7,1,3,6,9]
输出:[4,7,2,9,6,3,1]
/**
 * 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* mirrorTree(TreeNode* root) {
    
    
        stack<TreeNode*> s;
        if(root!=NULL) s.push(root);
        while(!s.empty())
        {
    
    
            TreeNode* cur = s.top();
            s.pop();
            swap(cur->left,cur->right);
            if(cur->left!=NULL) s.push(cur->left);
            if(cur->right!=NULL) s.push(cur->right);
        }
        return root;

    }
};

猜你喜欢

转载自blog.csdn.net/qq_47997583/article/details/121362659