二叉树--相同的树

给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。

如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

示例 1:

输入:p = [1,2,3], q = [1,2,3]
输出:true

思路

一、

何为相同?  必须从头到尾完完整整的相同,才算相同。

可通过前序遍历法,遍历整个树。

可通过以下思路:

//空节点

//至少有一个不为空

 //全不为空

二、

子问题:除了判断根节点,还需判断子树是否相同

结束条件:不同return false。 当完全相同时,根节点最终会走到空树,此时才能保证子树相同,返回true (也是唯一 一个可以返回true的条件)。

代码



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);     //右树

}

代码解读

1.

    //空节点也需要判断

    if (p == NULL && q == NULL)    

        return true;

树不能轻易assert判空,因为空节点也需要比较,也是树的一部分。

2.

    if (p == NULL || q == NULL)

        return false;

   由于第一个return的存在,能执行到此处时,必然一个不为空!

3.

 if (p->val != q->val)   //节点

        return false;

不能判断 == 就return true; 正如开头所说,必须全部相等才能return true;

4.

  return isSameTree(p->left, q->left)   //左树

        && isSameTree(p->right, q->right);     //右树

当所有递归都完成之后,每一层的结果都是true,才能最终返回true。

由于返回类型是bool类型,因此要用 && 逻辑与 连接两个递归结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值