编程题-相同的树

题目:

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

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

解法一(深度优先搜索):

如果两个二叉树都为空,则两个二叉树相同。如果两个二叉树中有且只有一个为空,则两个二叉树一定不相同。

如果两个二叉树都不为空,那么首先判断它们的根节点的值是否相同,若不相同则两个二叉树一定不同,若相同,再分别判断两个二叉树的左子树是否相同以及右子树是否相同。这是一个递归的过程,因此可以使用深度优先搜索,递归地判断两个二叉树是否相同。

class Solution {
public:
    bool isSameTree(TreeNode* p, TreeNode* q) {
        //如果p和q均为空,则两树一定相同
        if (p == nullptr && q == nullptr) {
            return true;
            //若p和q一个为空一个不为空,则一定不同
        } else if (p == nullptr || q == nullptr) {
            return false;
            //先判断根节点是否相同,若相同则再继续判断p和q的左子树和右子树节点是否相同
        } else if (p->val != q->val) {
            return false;
        } else {
            return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
        }
    }
};

解法二(广度优先搜索):

同样首先判断两个二叉树是否为空,如果两个二叉树都不为空,则从两个二叉树的根节点开始广度优先搜索。使用两个栈存储两个树的数据,先判断根节点值是否相同,然后再判断左子树和右子树节点值是否相同,栈为空时判断完成,代码如下所示:

class Solution {
public:
    bool isSameTree(TreeNode* p, TreeNode* q) {
        stack<TreeNode*> TreeNode1;
        stack<TreeNode*> TreeNode2;
        if(p==nullptr and q!=nullptr){
            return false;
        }
        if(p!=nullptr and q==nullptr){
            return false;
        }
        while((p!=nullptr and q!=nullptr) or (!TreeNode1.empty() and !TreeNode2.empty())){
            if(p->val!=q->val){
                return false;
            }
            if(p->right!=nullptr and q->right!=nullptr){
                if(p->right->val!=q->right->val){
                    return false;
                }
                TreeNode1.push((p->right));
                TreeNode2.push((q->right));
            }
            else if((p->right)!=nullptr and (q->right)==nullptr){
                return false;
            }
            else if ((p->right)==nullptr and (q->right)!=nullptr){
                return false;
            }
            if(p->left!=nullptr and q->left!=nullptr){
                if(p->left->val!=q->left->val){
                    return false;
                }
                TreeNode1.push(p->left);
                TreeNode2.push(q->left);
            }
            else if(p->left!=nullptr and q->left==nullptr){
                return false;
            }
            else if(p->left==nullptr and q->left!=nullptr){
                return false;
            }
            if(TreeNode1.empty() and TreeNode2.empty()){
                break;
            }
            p = TreeNode1.top();
            q = TreeNode2.top();
            TreeNode1.pop();
            TreeNode2.pop();
        }
        return true;
    }
};

特别注意:queue为定义队列的关键词,stack为定义栈的关键词

std::queue <TreeNode*> queue1, queue2;为队列的定义
std::stack<TreeNode*> stack1, stack2;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值