开宗明义:本系列基于牛客网剑指offer,刷题小白,一天两道我快乐!旨在理解和交流,重在记录,望各位大牛指点!
牛客网-剑指offer
1、树的子结构
描述:输入两颗二叉树A,B,判断B是不是A的子结构(我们约定空树不是任意一个树的子结构)。
思路1:
- 在 A A A 中找到和 B B B 的根节点的值一样的结点 R R R,这一步是树的遍历;
- 再判断树 A A A 中以 R R R 为根节点的子树是不是包含和树 B B B 一样的结构;
测试代码:
#include <algorithm>
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x):val(x),left(NULL),right(NULL){
//
}
};
class Solution {
bool isSubtree(TreeNode* pRootA, TreeNode* pRootB) {
if (pRootB == NULL)
return true;
if (pRootA == NULL)
return false;
if (pRootB->val == pRootA->val) {
return (isSubtree(pRootA->left, pRootB->left) && isSubtree(pRootA->right, pRootB->right));
}
else {
return false;
}
}
public:
bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2) {
if (pRoot1 == NULL || pRoot2 == NULL)
return false;
return isSubtree(pRoot1, pRoot2) || HasSubtree(pRoot1->left, pRoot2) || HasSubtree(pRoot1->right, pRoot2);
}
};
思路2:递归解决,换汤不换药;
测试代码:
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
//
class Solution {
public:
bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
{
bool result = false;
//当Tree1和Tree2都不为0的时候,才进行比较。否则直接返回False
if (pRoot2 != nullptr&& pRoot1 != nullptr) {
//如果找到对应Tree2的根节点的点
if (pRoot1->val == pRoot2->val) {
//以这个根节点为起点判断是否包含Tree2
result = doesTree1HaveTree2(pRoot1, pRoot2);
}
//如果找不到,那么就再去root的左儿子当做起点,去判断
if (!result) {
result = HasSubrtee(pRoot1->left, pRoot2);
}
//如果还找不到,那么就再去root的右儿子当做起点,去判断是否包含Tree2
if (!result) {
result = HasSubrtee(pRoot1->right, pRoot2);
}
}
return result;
}
bool doesTree1HaveTree2(TreeNode* node1, TreeNode* node2) {
//如果Tree2已经遍历完了,都能对应上,返回true
if (node2 == NULL) {
return true;
}
// 如果Tree2还没有遍历完,Tree1却遍历完,返回False
if (node1 == NULL) {
return false;
}
//如果其中一个点没有对应上返回false
if (node1->val != node2->val) {
return false;
}
//如果根节点对应的上,那么就分别去子节点里面匹配
return doesTree1HaveTree2(node1->left, node2->left) && doesTree1HaveTree2(node1->right, node2->right);
}
};
2、二叉树的镜像
描述:给定一颗二叉树。将其变为源二叉树的镜像。
思路:乍见,肯定递归嘛!
测试代码:
#include <algorithm>
using namespace std;
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) :val(x), left(NULL), right(NULL) {
//
}
};
class Solution {
public:
void Mirror(TreeNode *pRoot) {
if (pRoot == NULL) {
return;
}
swap(pRoot->left, pRoot->right);
Mirror(pRoot->left);
Mirror(pRoot->right);
return;
}
};