对称二叉树:将一棵二叉树沿着根节点对折,如果两棵子树完全重合(对称节点要么都为null,要么数据域完全相等),那么该二叉树是一个对称二叉树。
方法一 :队列+层次遍历判断二叉树是否对称
左子树:从左向右将节点放入队列1中。右子树:从右向左将节点放入队列2中。
每次循环删除并取出两个队列头结点,判断是否重合。知道队列为空。
bool isSymmetry(node
* root)
{
if(NULL==root) return
true;
node
*p1=root->left, *p2=root->right;
Queue
*q1= new Queue(), *q2=new Queue();
//建立连个队列
q1.Insert(p1); q2.Insert(p2);
while
(!q1.IsEmpty()&&!q2.IsEmpty())
{
p1=q1.delete(); p2=q2.delete();
//删除并取得队列中的第一个元素
//如果对称的两个节点只有一个为NULL,那么该二叉树不对称
if(NULL==p1
&& NULL!=p2) return
false;
if(NULL!=p1
&& NULL==p2)
return false;
//如果两个对称节点数据域不相等,则不对称
if(
(NULL1!=p1) && (
NULL!=p2)
&& (p1->data!=p2->data)
) return
false;
if(NULL!=p1)
{
q1.Insert(p1->left); q1.Insert(p1->right);
}
if(NULL!=p2)
{
q2.Insert(p2->right); q2.Insert(p2->left);
}
}
return
true;
}
方法二:先根遍历判断二叉树是否对称
左子树:遍历顺序为,父节点--左子节点--右子节点。
右子树:遍历顺序为,父节点--右子节点--左子节点。
对两个子树以相同速率,同时进行遍历,判断每一个对称节点是否重合。
代码略。
加载中,请稍候......