Swordは、Offerの7日目の検索およびバックトラッキングアルゴリズムを指します(単純)
剣はオファー26を指します。木の下部構造
トピックのアイデア
引き続きAツリーをトラバースし、AツリーのポイントがBツリーのルートノードと一致する場合に、それが下部構造であるかどうかを判断します。判断関数では、Bツリーが最初にトラバースされる場合、それはtrueであり、そうでない場合、Aが最初にトラバースされる場合はfalseであることに注意してください。
コード
class Solution {
public:
bool pan(TreeNode* A, TreeNode* B){
if(!B)return true;
if(!A)return false;
//cout<<A->val<<" "<<B->val<<endl;
if(A->val==B->val){
return pan(A->left,B->left)&&pan(A->right,B->right);
}else{
return false;
}
}
bool isSubStructure(TreeNode* A, TreeNode* B) {
if(!B||!A)return false;
if((A->val==B->val)&&pan(A->left,B->left)&&pan(A->right,B->right)){
//cout<<A->val<<endl;
return true;
}else{
//cout<<A->left->val<<endl;
return isSubStructure(A->left,B)||isSubStructure(A->right,B);
}
}
};
剣はオファー27を指します。二分木の鏡像
トピックのアイデア
左側のサブツリーと右側のサブツリーを入れ替えて、再帰的に実行します
コード
class Solution {
public:
TreeNode* mirrorTree(TreeNode* root) {
if(!root)return NULL;
TreeNode* l = mirrorTree(root->left);
TreeNode* r = mirrorTree(root->right);
root->left = r;
root->right = l;
return root;
}
};
剣はオファー28を指します。対称二分木
トピックのアイデア
前の質問と同様ですが、2つのツリー構造が対称であるかどうかを判断するためのもう1つの判断関数があります。2つのツリーは同じ構造であることに注意してください。A->左とB->右を比較し、A->右とB->左を比較する必要があります。
コード
class Solution {
public:
bool isSymmetric(TreeNode* root) {
if(!root)return true;
return pan(root->left,root->right);
}
private:
bool pan(TreeNode* A,TreeNode* B){
if(!A&&!B){
return true;
}
if(!A||!B||A->val!=B->val){
return false;
}
return pan(A->left,B->right)&&pan(A->right,B->left);
}
};
この記事が私の友達に役立つなら、私はいいねとサポートをしたいと思います〜ありがとうございました〜