递归树对称

时间:2017-06-25 23:20:39

标签: c++ binary-tree

我编写了以下代码片段来确定二进制树是否对称:

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。因此,我不确定我的方法中是否存在逻辑缺陷。

1 个答案:

答案 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的子项调用此方法。