-
対称二
分木二分木が与えられたら、それが鏡面対称であるかどうかを確認します。
オリジナルのタイトルポータルOvO -
反復実装
データの一時ストレージにキューを使用します(幅検索ではなく、データコンテナーとしてのみキューを使用します〜);
バイナリツリーのミラー対称性の条件は次のとおりです。
1.現在比較されている2つのノードの値は同じです;
2。左側のノードの左側の子は右側のノードの右側の子と等しく、左側のノードの右側の子は次のようになります。右側のノードの左側の子。
したがって、キューを使用して毎回保存します。比較する必要があるのはオブジェクトのペアであり、保存する前に判断する必要があります。現在のノードが空の場合、後続のノードは必要ありません。比較:このサイクルは終了します(次のサイクル条件の判断に直接入ります)、ノードがない場合、または2つのノードの値が等しくない場合、ツリーはすでに非対称であり、falseを返すことができます;
コードは以下の通りであります:
構造の定義:
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode() : val(0), left(nullptr), right(nullptr) {
}
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {
}
TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {
}
};
関数の実装:
class Solution {
public:
bool isSymmetric(TreeNode* root) {
queue<TreeNode*> que;
que.push(root);
que.push(root);
while (!que.empty()) {
TreeNode* leftNode = que.front();
que.pop();
TreeNode* rightNode = que.front();
que.pop();
if (!leftNode && !rightNode)
continue;
if(!leftNode||!rightNode||(leftNode->val!=rightNode->val))
return false;
que.push(leftNode->left);
que.push(rightNode->right);
que.push(leftNode->right);
que.push(rightNode->left);
}
return true;
}
};
-再帰的ディープサーチプレオーダーディープサーチを
使用します。
class Solution {
public:
bool RecurPre(TreeNode* root1, TreeNode* root2) {
if(!root1&&!root2)//两个节点都为空
return true;
if(!root1||!root2)
return false;
return root1->val == root2->val && RecurPre(root1->left, root2->right) && RecurPre(root1->right, root2->left);
}
bool isSymmetric(TreeNode* root) {
return RecurPre(root, root);
}
};