二叉树OJ题(1)

1 单值二叉树

👉OJ链接

思路分析

  • 分治:自己、左子树、右子树
  • 结束条件:遇到空,就返回到所调用的函数
  • 每一个都是自己和自己左右子树进行比较,如果不相等且不为空,返回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 相同的树

👉OJ链接

思路分析

  • 分治思想:根和根比较相同----->左子树和左子树比较&&右子树和右子树比较 
  • 都是对应的节点和节点进行比较
  • 两个节点中数字相等,则继续往下比较(遍历比较)。不相等则返回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 翻转二叉树

👉OJ链接

思路分析

  • 这道题和上道题差不多,只不过是创建出两个镜像的二叉树,已知一个二叉树,创建另一个二叉树。
  • 分治:根的左右子树进行交换
  • 每一个都是根的左右子树进行交换,依次向下递归

代码实现

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 另一棵树的子树

👉OJ链接

思路分析

分治:左右子树遍历比较 

  • 若为空树 则返回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);
}
  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值