思路就是:非递归中序遍历,只不过左子树右子树同时进行,而且方向始终相反,每一动一步都要判断当前两个指针的内容是否不同,一旦不同返回false;最后返回true;如下:
bool isSymmetric(TreeNode *root) {
if(root==NULL)
return true;
if(root->left==NULL&&root->right==NULL)
return true;
if(root->left!=NULL&&root->right==NULL||root->left==NULL&&root->right!=NULL)
return false;
if(root->left->val!=root->right->val)
return false;
TreeNode *p=NULL,*q=NULL;
TreeNode *rp=NULL,*rq=NULL;
p = root->left;
rp = root->right;
stack<TreeNode*> stk;
stack<TreeNode*> rstk;
TreeNode *temp,*rtemp;
while((p||!stk.empty())&&(rp||!rstk.empty()))
{
if (p==NULL&&rp!=NULL||p!=NULL&&rp==NULL)
return false;
if(stk.size()!=rstk.size())
return false;
while(p&&rp)
{
if(p->val!=rp->val)
return false;
stk.push(p);
p = p->left;
rstk.push(rp);
rp = rp->right;
if (p==NULL&&rp!=NULL||p!=NULL&&rp==NULL)
return false;
if(stk.size()!=rstk.size())
return false;
}
if (p==NULL&&rp!=NULL||p!=NULL&&rp==NULL)
return false;
if(stk.size()!=rstk.size())
return false;
if(!stk.empty()&&!rstk.empty())
{
temp = stk.top();
rtemp = rstk.top();
if(temp->val!=rtemp->val)
return false;
stk.pop();
rstk.pop();
p = temp->right;
rp = rtemp->left;
}
}
if (p==NULL&&rp!=NULL||p!=NULL&&rp==NULL)
return false;
if(stk.size()!=rstk.size())
return false;
return true;
}

本文介绍了一种非递归的方法来判断一棵二叉树是否为对称的。通过对二叉树的左右子树进行同时遍历,并始终保持方向相反,每一步都检查当前节点是否相等,最终确定整棵树是否对称。
285

被折叠的 条评论
为什么被折叠?



