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);
}
};