剑指 offer 30天打卡 (持续更新)day7

Day 7 胜利属于达瓦里氏!

题目1 剑指 Offer 26. 树的子结构
题目2 剑指 Offer 27. 二叉树的镜像
题目3.剑指 Offer 28. 对称的二叉树

1 . 剑指 Offer 26. 树的子结构

思路:先按照根节点进行递归 如果根节点不匹配就 递归左右子树
递归左右子树时 注意如果temp2已经被遍历完了 会先返回true
如果temp2 还没结束temp1结束了会返回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 issubtree(TreeNode * temp1 , TreeNode* temp2){
        if(!temp2) return true;
        if(!temp1 || temp1-> val != temp2 -> val) return false;
        return issubtree(temp1 -> left , temp2 -> left) && issubtree(temp1 -> right , temp2 -> right);
    }
    
    bool isSubStructure(TreeNode* A, TreeNode* B) {
         if(!A || !B) return false;
         if(issubtree(A , B)) return true;
         return isSubStructure(A -> left , B) || isSubStructure(A -> right , B);
    }
};

2. 剑指 Offer 27. 二叉树的镜像

思路:短短几行 代码苦思良久 我还是太菜了
考虑递归问题还是要从宏观的角度来看问题
比如 这个·left 这个right 从宏观来看当成 左右子树来考虑 从节点的角度来看就当成 具体的左孩子右孩子来考虑
可能这样理解效果会好不少

class Solution {
public:

    TreeNode* mirrorTree(TreeNode* root) {
        if(!root) return NULL;
        auto left = mirrorTree(root -> left); 
        auto right = mirrorTree(root -> right); 
        root -> left = right;
        root -> right = left; 
        return root;
    }
};

3 .剑指 Offer 28. 对称的二叉树

思路:用两个指针一个朝左一个朝右进行扫描 多想多思考

class Solution {
public:
    bool dfs(TreeNode*temp1 , TreeNode*temp2){
        if(!temp1 && !temp2) return true;
        if(!temp1 && temp2 )  return false;
        if(!temp2 && temp1) return false;
        if(temp1 -> val != temp2 -> val)return false;
        return dfs(temp1->left , temp2 -> right) && dfs(temp1 -> right , temp2 -> left);
    }

    bool isSymmetric(TreeNode* root) {
      if(!root) return true;
      return dfs(root->left , root->right);
    }
};
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值