2本の木が同じかどうかを再帰的に判断する


再帰的な書き方は2本の木が同じかどうかを判断します.
bool flag = true; //            ,         flag ,       ,   
void judge(node* root1, node* root2)
{
    if(root1 == root2) return; //                ,      flag
    if((root1 == NULL && root2 != NULL) || (root2 == NULL && root1 != NULL))
    {
                //          ,      
                flag = false;
        return;
    }

    if(root1->data != root2->data)
    {
        flag = false;
        return;
    }

    judge(root1->left,root2->left);
    judge(root1->right, root2->right);
}

judge関数をboolに設定してtrueまたはfalseを返すと、このような再帰はよくわかりません.内層がtrueを返すと、外層がfalseを返すので、内層breakでも外に1層飛び出すだけで、直接一番外に戻ることはできません.
このような外にflagを挿入する再帰的な書き方は、デバッグを書くのによくわかります.
デフォルトの2本の木は等しいので、judge関数は1つのことをします:2本の木のどんな異なる場所に出会ってflagをfalseに変えて、このように判断の唯一性を保証することができます.