目录
day7:
一. 剑指 Offer 26. 树的子结构
题目:
输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构),B是A的子结构, 即 A中有出现和B相同的结构和节点值。
示例:
输入: A = [1,2,3], B = [3,1]
输出: false
解题思路:
递归(dfs), 主要找到dfs终止条件:
1. 当节点B为空时:说明B已经匹配完成,返回true
2. 当节点A为空时:说明已经越过树A的叶节点, 返回false
3. 当节点A的值不等于节点B的值时:说明匹配不成功, 返回false
c++代码:
/**
* 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 == nullptr || B == nullptr) return false;
bool res;
res = dfs(A, B);
if(res) return res;
res = isSubStructure(A -> left, B) || isSubStructure(A -> right, B);
return res;
}
private:
bool dfs(TreeNode* A, TreeNode* B){
if(B == nullptr) return true;
if(A == nullptr) return false;
if(A -> val != B -> val) return false;
return dfs(A -> left, B -> left) && dfs(A -> right, B -> right);
}
};
二. 剑指 Offer 27. 二叉树的镜像
题目:
请完成一个函数,输入一个二叉树,该函数输出它的镜像。
示例:
输入: root = [4,2,7,1,3,6,9]
输出: [4,7,2,9,6,3,1]
解题思路一:
辅助队列
c++代码:
/**
* 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) {
//辅助队列
if(root == nullptr) return nullptr;
queue<TreeNode*> que;
que.push(root);
while(!que.empty())
{
TreeNode* node = que.front();
que.pop();
if(node -> left != nullptr) que.push(node -> left);
if(node -> right != nullptr) que.push(node -> right);
TreeNode* temp = node -> left;
node -> left = node -> right;
node -> right = temp;
}
return root;
}
};
解题思路二:
递归
c++代码:
/**
* 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) {
//dfs
if(root == nullptr) return nullptr;
TreeNode* node = root -> left;
root -> left = mirrorTree(root -> right);
root -> right = mirrorTree(node);
return root;
}
};
三. 剑指 Offer 28. 对称的二叉树
题目:
请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。
示例:
输入: root = [1,2,2,null,3,null,3]
输出: false
解题思路:
递归(dfs), 主要找到dfs终止条件:
1. 当节点为L和R同时为空时:说明树使对称的,返回true
2. 当节点L或R为空时:说明此数不对称, 返回false
3.L的值不等于节点R的值时:说明匹配不成功, 返回false
c++代码:
/**
* 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) {
if(root == nullptr) return true; //当树为空时,返回true
bool res = dfs(root -> left, root -> right);
return res;
}
private:
bool dfs(TreeNode* l, TreeNode* r){
if(l == nullptr && r == nullptr) return true;
if(l == nullptr || r == nullptr) return false;
if(l -> val != r -> val) return false;
return dfs(l -> left, r -> right) && dfs(l -> right, r -> left);
}
};
题目源自: