1 单值二叉树
思路分析
- 分治:自己、左子树、右子树
- 结束条件:遇到空,就返回到所调用的函数
- 每一个都是自己和自己左右子树进行比较,如果不相等且不为空,返回false。如果相等,继续递归。(先检查自己,再检查左子树,再检查右子树)
代码实现
bool isUnivalTree(struct TreeNode* root) {
if (root == NULL)
return true;
if (root->left && root->left->val != root->val)
{
return false;
}
if (root->right && root->right->val != root->val)
{
return false;
}
return isUnivalTree(root->left) && isUnivalTree(root->right);
}
2 相同的树
思路分析
- 分治思想:根和根比较相同----->左子树和左子树比较&&右子树和右子树比较
- 都是对应的节点和节点进行比较
- 两个节点中数字相等,则继续往下比较(遍历比较)。不相等则返回false
有以下三种情况,要都考虑到,防止系统崩溃。
- 两棵树的根节点都是NULL
- 两棵树的一个根节点为NULL,另外一个不为NULL
- 两棵树根节点都不为NULL
- 注意:必须左右两边子树都相等才可返回true,只是一边并不能返回true。
代码实现
bool isSameTree(struct TreeNode* p, struct TreeNode* q) {
//两个都为空
if(p == NULL && q == NULL)
{
return true;
}
//其中一个为空,另一个不为空
if(p == NULL || q == NULL)
{
return false;
}
//两个都不为NULL且不相等
if(p->val != q->val)
{
return false;
}
return isSameTree(p->left,q->left)
&& isSameTree(p->right,q->right);
}
递归展开图
3 对称二叉树
👉OJ链接 又称镜像二叉树。 (相同的数的变形)
思路分析
- 分治:根 把左子树和右子树看成两棵树比较 左子树的左节点和右子树右节点比,左子树右节点和右子树左节点比。
- 不断递归下去。和第二题isSameTree类似。
- 两个根都为空 true
- 一个根为空一个根不为空 false
- 两个都不为空 -> 下一步判断
代码实现
bool _isSymmetric(struct TreeNode* root1, struct TreeNode* root2) {
//都为null
if(root1 == NULL && root2 == NULL)
{
return true;
}
//其中一个为null
if(root1 == NULL || root2 == NULL)
{
return false;
}
//两个都不为空
if(root1->val != root2->val)
{
return false;
}
return _isSymmetric(root1->left,root2->right)
&& _isSymmetric(root1->right,root2->left);
}
bool isSymmetric(struct TreeNode* root) {
return _isSymmetric(root->left,root->right);
}
图示分析
4 翻转二叉树
思路分析
- 这道题和上道题差不多,只不过是创建出两个镜像的二叉树,已知一个二叉树,创建另一个二叉树。
- 分治:根的左右子树进行交换
- 每一个都是根的左右子树进行交换,依次向下递归
代码实现
struct TreeNode* mirrorTree(struct TreeNode* root){
if(root == NULL){
return NULL;
}
struct TreeNode *left = mirrorTree(root -> left);
struct TreeNode *right = mirrorTree(root -> right);
root -> left = right;
root -> right = left;
return root;
}
递归展开图
5 另一棵树的子树
思路分析
分治:左右子树遍历比较
- 若为空树 则返回false
- 若不为空树,遍历root
- 比较并且找到第一个与subRoot子树的根节点相等的节点,从这个节点开始比较后面的节点root&subRoot
当找到相同节点时
- 若全部相等,则root返回true
- 若不相等,不能直接全部返回false,也有可能存在第二个相等的节点,所以要继续向下遍历(易错)
代码实现
bool isSameTree(struct TreeNode* p, struct TreeNode* q) {
//两个都为空
if(p == NULL && q == NULL)
return true;
//其中一个为空,另一个不为空
if(p == NULL || q == NULL)
return false;
//两个都不为NULL且不相等
if(p->val != q->val)
return false;
return isSameTree(p->left,q->left)
&& isSameTree(p->right,q->right);
}
bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot){
if(root == NULL)
{
return false;
}
if(root->val == subRoot->val)
{
if(isSameTree(root,subRoot))//返回true
{
return true;
}
}
return isSubtree(root->left,subRoot) || isSubtree(root->right,subRoot);
}
或者直接改为
bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot){
if(root == NULL)
{
return false;
}
return isSameTree(root,subRoot)||
isSubtree(root->left,subRoot) ||
isSubtree(root->right,subRoot);
}