Leetcodeインタビューの質問26.ツリーの部分構造とLeetcode 617.バイナリツリーのマージとLeetcodeインタビューの質問28.対称バイナリツリー

Leetcodeインタビューの質問26.ツリーの部分構造

問題の説明

2つの二分木AとBを入力して、BがAの部分構造かどうかを判別します。(空のツリーはどのツリーのサブ構造でもないことに同意します)
BはAのサブ構造です。つまり、AはBと同じ構造とノード値を持っています。

問題解決レポート

BはAのサブ構造です。3つのケースがあります。

  • BのルートノードはAのルートノードと同じですが、分岐後、Bが最初に停止します。この場合はhelper()関数に対応します。
  • BはAの左側のサブツリーのサブ構造であり、このケースはisSubStructure()関数に対応します。
  • BはAの右側のサブツリーのサブ構造であり、このケースはisSubStructure()関数に対応します。

実装コード

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    bool isSubStructure(TreeNode* A, TreeNode* B) {
        if(A==NULL||B==NULL){
            return false;
        }
        if(B->val==A->val){
            return helper(A->left,B->left)&&helper(A->right, B->right);
        }
        else{
            return isSubStructure(A->left,B)||isSubStructure(A->right, B);
        }
    }
    bool helper(TreeNode* A, TreeNode* B){
        // 边界条件
        if(A==NULL||B==NULL){
            return B==NULL?true:false;
        }
        
        if(A->val==B->val){
            return helper(A->left,B->left)&&helper(A->right, B->right);
        }
        else{
            return false;
        }
        return true;
    }
};

参考文献

[1] Leetcodeインタビューの質問26.ツリーの部分構造

Leetcode617。バイナリツリーのマージ

問題の説明

2つのバイナリツリーが与えられた場合、それらの一方をもう一方にオーバーレイすると、2つのバイナリツリーの一部のノードがオーバーラップすることを想像してください。
それらを新しいバイナリツリーにマージする必要があります。マージのルールは、2つのノードがオーバーラップする場合、それらの値はノードがマージされた後に新しい値として追加されることです。それ以外の場合、NULLでないノードは直接新しいバイナリツリーのノードになります。

問題解決レポート

  • 両方のツリーの同じノードがない場合、それらをスタックにプッシュします。
  • 左側のツリーの後続ノード(右側のツリーに対応)が空の場合、そのフォローアップを右側のツリーの後続ノードに向けます。
  • 左側のツリーの次のノード(右側のツリーに対応)が空ではなく、右側の対応するノードの次のノードが空の場合、処理されません。

実装コード

非再帰的

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
	TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) {
		if (t1 == NULL) return t2;
		if (t2 == NULL) return t1;
		stack<TreeNode*>s;
		s.push(t1);
		s.push(t2);
		while (!s.empty()){
			TreeNode* s2 = s.top();
			s.pop();
			TreeNode* s1 = s.top();
			s.pop();
			s1->val = s1->val + s2->val;
			if (s1->left == NULL) s1->left = s2->left;
			else if (s1->left != NULL && s2->left != NULL){
				s.push(s1->left);
				s.push(s2->left);
			}
			if (s1->right == NULL) s1->right = s2->right;
			else if (s1->right != NULL && s2->right != NULL){
				s.push(s1->right);
				s.push(s2->right);
			}
		}
		return t1;
	}
};

再帰的

class Solution {
public:
    TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2)
    {
        if(!t1)
            return t2;
        if(!t2)
            return t1; 
        t1->val += t2->val;
        t1->left = mergeTrees(t1->left, t2->left);
        t1->right = mergeTrees(t1->right, t2->right);
        return t1;
    }
};

参考文献

Leetcodeインタビューの質問28.対称二分木

問題の説明

バイナリツリーが対称であるかどうかを判断する関数を実装してください。二分木がその鏡像と同じである場合、それは対称的です。
たとえば、二分木[1,2,2,3,4,4,3]は対称です。しかし、それ[1,2,2,null,3,null,3]は対称的はありません。

問題解決レポート

再帰的な分析左右のサブツリーは対称的です。
左右のサブツリーの対称性は、次の3つの条件を満たす必要があります。

  • 左側のサブツリーのルートノードの値は、右側のサブツリーのルートノードの値と同じです。
  • 左のサブツリーの左のサブツリーと右のサブツリーの右のサブツリーは対称です。
  • 左側のサブツリーの右側のサブツリーと右側のサブツリーの左側のサブツリーは対称です。

実装コード

非再帰的

class Solution{
    public:
        bool isSymmetric(TreeNode *root){
            TreeNode *left, *right;
            if(root==NULL) return true;
            queue<TreeNode*>q;
            q.push(root->left);
            q.push(root->right);
            while(!q.empty()){
                left=q.front();
                q.pop();
                right=q.front();
                q.pop();
                if(left==NULL&&right==NULL) continue;
                if(left==NULL||right==NULL) return false;
                if(left->val != right->val) return false;

                q.push(left->left);
                q.push(right->right);

                q.push(left->right);
                q.push(right->left);
            }
            return true;
        }
};

再帰的

class Solution {
public:
    bool isSymmetric(TreeNode* root) {
        if(root!=NULL){
            return helper(root->left, root->right);
        }
        return true;
    }
    bool helper(TreeNode*left, TreeNode*right){
        if(left==NULL&&right==NULL) return true;
        if(left==NULL||right==NULL) return false;
        if(left->val != right->val) return false;
        return helper(left->left, right->right)&&helper(left->right,right->left);
    }
};

参考文献

[1] Leetcodeインタビューの質問28.対称二分木
[2] 問題解決領域:Don QuixoteとSancho

MD_
139の元の記事を公開 賞賛8 10,000+ビュー

おすすめ

転載: blog.csdn.net/qq_27690765/article/details/105344672