每日算法题【二叉树】:单值二叉树、相同的树

(1)单值二叉树
  • 965. 单值二叉树 - 力扣(LeetCode)

  • 解题思路:

    通过前序遍历,比较每个根节点与其左右子树的根节点是否相同;相同接着递归下去比较,如果都相同就会把所有的true返回;不相同就会停止递归,把false返回。

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     struct TreeNode *left;
     *     struct TreeNode *right;
     * };
     */
    bool isUnivalTree(struct TreeNode* root) {
        //通过前序遍历,比较每个根节点与其左右子树的根节点是否相同
        //相同接着递归下去比较,如果都相同就会把所有的true返回
        //不相同就会停止递归,把false返回
    
        //如果根节点直接为空则返回true
        if(root == NULL){//第一个递归结束条件
            return true;
        }
        //如果根节点与左右子节点不同则直接返回false
        //root->left必须放在前面判断是否为空再进行比较
        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)检查两颗树是否相同
  • 100. 相同的树 - 力扣(LeetCode)

  • 解题思路:

    • 使用前序遍历两棵二叉树,然后判断两棵二叉树节点的情况,一共分为两大类四种情况。

    • 第一类两棵二叉树的根节点有为空的:

      1. 若都为空则是相同的树返回true
      2. 有一个是空则证明为不相同的树返回false
    • 第二类两棵二叉树的根节点都不为空:

      1. 若两个根节点不相同,则证明为不同的树,返回false。
      2. 两个根节点相同则在这一层是相同的树,需要继续递下去看两颗子树的根结点情况
    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     struct TreeNode *left;
     *     struct TreeNode *right;
     * };
     */
    bool isSameTree(struct TreeNode* p, struct TreeNode* q) {
        //两棵二叉树的根节点都为空则是相同的树
        if(p == NULL && q == NULL){//第一个递归结束条件
            return true;
        }
        //走到这说明肯定有一个子树不为空
        //两棵二叉树的根节点有一个是空则证明为不相同的树
        if(p == NULL || q == NULL){//第二个递归结束条件
            return false;
        }
        //两棵二叉树的根节点都不为空且两个根节点不相同,则证明为不同的树
        if(p->val != q->val){//第三个递归结束条件
            return false;
        }
        return isSameTree(p->left,q->left) && isSameTree(p->right,q->right);
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值