在判断一个二叉树是否为对称二叉树时,第一个脑海里的念头是中序遍历一次,把数值存入一个容器中,比较num[i] : 0->n/2 num[j] : n-1->n/2大小是否相等,这种方法在没有数字相同或大部分数字不同的情况下可行,但当树的数字相同就无法判断。
以下是想到的正确方法
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
class Solution {
public:
bool isSymmetrical(TreeNode* pRoot)
{
return CompareNode(pRoot,pRoot);
}
bool CompareNode(TreeNode* Node1,TreeNode* Node2){
if(Node1==NULL&&Node2==NULL) return true;
if(Node1==NULL||Node2==NULL) return false;
if(Node1->val!=Node2->val) return false;
return CompareNode(Node1->left,Node2->right)&&CompareNode(Node1->right,Node2->left);
}
}
原来的代码
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
class Solution {
public:
bool isSymmetrical(TreeNode* pRoot)
{
if(pRoot==NULL) return true;
vector<int> mid;
inorder(pRoot,mid);
int i=0;
int j=mid.size()-1;
while(i<j){
if(mid[i++]==mid[j--])
continue;
else return false;
}
return true;
}
void inorder(TreeNode* pRoot,vector<int> &mid){
if(pRoot){
inorder(pRoot->left,mid);
mid.push_back(pRoot->val);
inorder(pRoot->right,mid);
}
}
};
记录自己的错误,你想到的办法不一定是最好的办法,在实现前先预先考虑最根本的问题。