二分木 OJ 質問 3

皆さん、こんにちは。しばらくブログを更新していませんでした。主な理由は、この期間中は学校の期末試験の準備をしなければならないためで、ブログに時間の一部を割り当てませんでした。今日はバイナリ ツリーの再帰に関連する OJ を引き続き見ていきます。質問、今日学習することは、同じツリーを判断することです。質問に答えてみてください -- 100、直接リンク https: //leetcode.cn/problems/same-tree/

まず、この質問の質問要件を見てみましょう。2 つの木のルート ノード p と q が与えられています。2 つの木が同じであるかどうかを判断してみましょう。それは、2 つの木の対応するルート ノードが一致するかどうかを判断することに他なりません。等しいです。それから始めましょう。質問をしてください。まず、2 つのツリーが同時に空であるときの状況を判断し、次に true を返す必要があります。

if(p==NULL&&q==NULL)//两棵树同时为空
    {
        return true;
    }

両方の木が空である場合は判定されましたが、一方の木が空で、もう一方の木が空ではない場合はどうなるでしょうか。 、それはまだ同じルーチンです、つまり

 if(p==NULL||q==NULL)//只有一颗树为空
    {
        return false;
    }

なぜこのように書かれているかわかりますか?コードがこの if に入ることができる前提は、2 つのツリーが同時に空になることはできないということなので、|| を使用して一方のツリーが空であるかどうかを判断できます。p==NULL の場合、後続の q は空であるとは判断しません。 ==NULL は、p!=NULL の場合、q==NULL と判断され、どちらか一方の条件を満たす限り、2 つのツリーは等しくないため、false が返されます。

木が空であると判断され、コードが下に降り続ければ、木は空ではないことを意味し、p と q の val が等しいかどうかを直接判断します。

if(p->val!=q->val)//判断p和q的val
    {
        return false;
    }

p と q の値が等しくない場合、2 つのツリーは異なるものとなるため、下に進み続ける必要はなく、直接 false を返すことができます。

さらに下に進むと、p と q が 2 つの木のルート ノードとして等しいことが証明され、2 つの木の左の部分木と右の部分木を再帰的に判断できます。

return isSameTree(p->left,q->left)&&isSameTree(p->right,q->right);//递归判断左右子树

コードはここで完了しました。送信を実行します

 完全なコード

/**
 * 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);
}

おすすめ

転載: blog.csdn.net/weixin_67131528/article/details/134834723