二分木のブラッシング練習 (2)


序文


ここに画像の説明を挿入

前の記事に引き続き、この記事は引き続きバイナリ ツリーの基本的な問題です。

1.同じ木

1.トピック紹介

同じツリー内のトピック
ここに画像の説明を挿入

2. アイデア

この質問の考え方は非常に単純で、2 つのツリーを 1 回トラバースするだけです (この質問は独立して実行できる必要があり、次の質問はこの質問から導き出されます)。

3.コード

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

2. 対称二分木

1.トピック紹介

トピックは対称二分木にあります
ここに画像の説明を挿入

2. アイデア

対称二分木は前問の高度な問題、つまり軸対称であり、再帰は分割統治の考え方で、少数の数から全体の木の法則を求めることができます。図から、ルートの左サブツリーの右サブツリーがルートの右サブツリーの左サブツリーと等しいかどうか、およびルートの左サブツリーの左サブツリーがルートの右サブツリーの右サブツリーと等しいかどうかのみを確認する必要があることがわかりますここに画像の説明を挿入

3.コード

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
 bool PreOrder(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 PreOrder(p->left,q->right)&&PreOrder(p->right,q->left);//&&只要有一个false就是flase了,所以上面都是讨论false的情况
}
bool isSymmetric(struct TreeNode* root){
    
    
    return PreOrder(root->left,root->right);
}

3. 別のツリーのサブツリー

1.トピック紹介

サブジェクトは別のツリーのサブツリーにあります
ここに画像の説明を挿入

2. アイデア

この質問は最初の質問の組み合わせに基づいています. 質問は木の部分木を言います. 数の部分木がこの木と同じかどうかを尋ねているだけではありませんか? 1回トラバースして各ノードを取りましょう. root と subroot が同じ場合、このノードをルートとするツリーが subroot と同じかどうかを判断します

3.コード

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
bool judge(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 judge(p->left,q->left)&&judge(p->right,q->right);
}

bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot){
    
    
    if(root==NULL)
    {
    
    
        return false;
    }
    if(root->val==subRoot->val&&judge(root,subRoot))
    {
    
    
        return true;
    }
    return isSubtree(root->left,subRoot)||isSubtree(root->right,subRoot);

}

要約する

二分木oj問題の基本部分は大体終わったので、二分木の難しい問題は後ほど更新していきますので、楽しみにしていただければ投票よろしくお願いします(

おすすめ

転載: blog.csdn.net/Ruiren_/article/details/129903294