剑指offer day7

103 阅读1分钟

刷题计划(第6天)

时间:2022.4.22

题数:3

题目类型:搜索与回溯算法

1. #### 二叉树的镜像

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

image.png

这个也算考研的高频题了

class Solution {
public:
    TreeNode* swap(TreeNode* root){
        if(root==NULL) return NULL;
        if(root->right==NULL&&root->left==NULL) return root;
        swap(root->left);
        swap(root->right);
        TreeNode* temp=root->right;
        root->right=root->left;
        root->left=temp;
        return root;
    }
    TreeNode* mirrorTree(TreeNode* root) {
        return swap(root);
    }
};

image.png

这里时间100%就没管了

2. 对称的二叉树

请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。

这题和上题有点区别,

/**
 * 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 isSymmetric(TreeNode* root) {
        return twotree(root,root);
    }
    bool twotree(TreeNode* a,TreeNode* b){
        if (!a && !b) return true;
        if (!a || !b) return false;
        return a->val==b->val&&twotree(a->right,b->left)&&twotree(a->left,b->right);
    }
};

image.png

3. 树的子结构

输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构) B是A的子结构, 即 A中有出现和B相同的结构和节点值

/**
 * 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;
        return twoTree(A,B)||isSubStructure(A->left,B)||isSubStructure(A->right,B);

    }
    bool twoTree(TreeNode* a,TreeNode* b){
        if(b==NULL) return true;
        if(a==NULL) return false;
        return a->val==b->val && twoTree(a->right,b->right) && twoTree(a->left,b->left);
    }
};

image.png

总结

树的bfs,同时利用递归来进行解题