我编写了以下代码片段来确定二进制树是否对称:
int(role)
我的目标是,在第1级,我检查根的左右儿童是否相等(因为在这个级别只有一个根及其两个孩子)。对于所有剩余的级别,我会检查/**
* 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 symmetricityChecker(TreeNode* root, int level) {
bool isValid=false;
if(root==NULL)
return true;
if(level==1)
isValid = root->left->val==root->right->val;
if(root->left!=NULL && root->right!=NULL) {
if(root->left->left!=NULL && root->right->right!=NULL)
isValid = root->left->left->val==root->right->right->val;
if(root->left->right!=NULL && root->right->left!=NULL)
isValid = root->left->right->val==root->right->left->val;
}
return isValid && symmetricityChecker(root->left, level+1) && symmetricityChecker(root->right, level+1);
}
bool isSymmetric(TreeNode* root) {
return symmetricityChecker(root, 0);
}
};
的{{1}}孩子的left
孩子是否等于root
的{{1}}孩子} left
孩子。同样,我会检查right
root
孩子的right
孩子是否等于right
&#39的root
孩子; left
孩子。 (这是这样的,因为在前一个递归调用中已经检查了根的直接左右子节点的对称性。)
我相信我的算法是正确的,但它产生的结果不正确。有人可以指出我的逻辑是否不正确,或者实施中是否存在错误?
编辑:我测试了输入left
的代码。我希望答案为root
,但请改为right
。因此,我不确定我的方法中是否存在逻辑缺陷。
答案 0 :(得分:2)
错误的部分是你正在做的事情:
return isValid && symmetricityChecker(root->left, level+1) && symmetricityChecker(root->right, level+1);
通过在单个子节点上调用symmetricityChecker
,您期望孩子们也是对称的,但这不应该是真的。所以它会失败,因为子树[2,3,4]不是对称的,并认为整个树不对称,即使这不是真的。
要递归地检查对称性,您必须保留两个节点(即左和右)作为您的状态,而不仅仅是一个。一旦确认两个节点是对称的,就可以通过类似的检查来检查他们的子节点,看看你在嵌套的if条件下做了什么。
另一种方法是编写BFS,并检查同一级别中的所有节点是否对称。这样,它应该像检查数组是否对称一样简单,因为你将同一个数组中的所有节点都放在彼此相邻的位置。
编辑: 添加伪代码:
bool symmetricityChecker(left, right) {
// Write the base case, check for nulls, corner cases, etc.
if(left != right) return false
return symmetricityChecker(left.left, right.right) &&
symmetricityChecker(left.right, right.left)
}
在您只拥有root的开头,请使用root的子项调用此方法。