目录
1.相同的树
2.对称二叉树
3.翻转二叉树
4.另一颗树的子树
- 题目代码
- 思路整体分析&注意事项
- 易错点
- 画图递归分析 
  树=根+左子树+右子树 
-  分支的思想 
-  多情况考虑 
1.相同的树
100. 相同的树 - 力扣(LeetCode) https://leetcode.cn/problems/same-tree/description/
https://leetcode.cn/problems/same-tree/description/
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 isSameTree(p->left,q->left) && isSameTree(p->right,q->right);
    }
    return false;
}
- 分治思想:根和根比较相同----->左子树和左子树比较&&右子树和右子树比较
- 一个节点一个节点比较(每个节点看成自己的根)
- 两棵树的根节点都是NULL
- 两棵树的一个根节点为NULL,另外一个不为NULL
- 两棵树根节点都不为NULL
- 两个节点中数字相等,则继续往下比较(遍历比较)
- 不相等则返回false
- && 必须左右两边子树都相等都为true才可返回true


2.对称二叉树
101. 对称二叉树 - 力扣(LeetCode) https://leetcode.cn/problems/symmetric-tree/
https://leetcode.cn/problems/symmetric-tree/
bool isSameTree(struct TreeNode* p, struct TreeNode* q) {
    //都为null
    if(p == NULL && q == NULL)
    {
        return true;
    }
    //一个为为null 
    if(p == NULL || q == NULL)
    {
        return false;
    }
    //两个都不为空
    if(p->val == q->val)
    {
      return isSameTree(p->left,q->right) && isSameTree(p->right,q->left);
    }
    return false;
}
bool isSymmetric(struct TreeNode* root) {
    return isSameTree(root->left,root->right);
}
- 分支思想:把左子树和右子树看成两棵树比较
- 调用isSameTree
- isSameTree是左节点等于右节点,右节点等于左节点,形成镜像相等
- 其他同isSameTree

3.翻转二叉树
LCR 144. 翻转二叉树 - 力扣(LeetCode) https://leetcode.cn/problems/er-cha-shu-de-jing-xiang-lcof/description/
https://leetcode.cn/problems/er-cha-shu-de-jing-xiang-lcof/description/
//方法1--交换向下
struct TreeNode* mirrorTree(struct TreeNode* root){
    if(root == NULL)
    {
        return NULL;
    }
    struct TreeNode*tmp=root->left;
    root->left=root->right;
    root->right=tmp;
    mirrorTree(root->left);
    mirrorTree(root->right);
    return root;
}
- 方法1:交换往下,返回根节点
- 分治思想:根指向的左右子树交换
- 空树返回空
- 交换左右子树
- 往下走
- 交换完左右子树,返回根节点
 
 
//方法2--向下交换
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;
}
- 方法2:向下交换。向下 / 返回根节点 / 保存根节点 / 然后交换
- 分支思想:根指向的左右子树交换
- 向下
- 返回根节点 / 空
- 保存根节点 / 空
- 节点和节点交换 (空和空交换)
 
 
- 返回值一定需要接收吗?
- ?结构体交换 ?只交换val
- 递归返回:return / 程序结束
4.另一颗树的子树
572. 另一棵树的子树 - 力扣(LeetCode) https://leetcode.cn/problems/subtree-of-another-tree/description/
https://leetcode.cn/problems/subtree-of-another-tree/description/
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
bool isSameTree(struct TreeNode* p, struct TreeNode* q) {
    //都为null
    if(p == NULL && q == NULL)
    {
        return true;
    }
    //一个为为null 
    if(p == NULL || q == NULL)
    {
        return false;
    }
    //两个都不为空
    if(p->val == q->val)
    {
      return isSameTree(p->left,q->left) && isSameTree(p->right,q->right);
    }
    return false;
}
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);
}
- 分治思想:左右子树遍历+比较
- 若为空树 则返回false
- 若不为空树,遍历root
- 比较并且找到第一个与subRoot子树的根节点相等的节点
- 从这个节点开始比较后面的节点root&subRoot
- 比较遍历整个子树subRoot
- || 左右子树有一个包含subRoot即可
- 从第一个相等的节点开始遍历比较
- 若全部相等,则root返回true
- 若不相等,不能root返回false,存在第二个相等的节点(还可能遍历)

5.平衡二叉树
110. 平衡二叉树 - 力扣(LeetCode)
🙂感谢大家的阅读,若有错误和不足,欢迎指正




















