加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

判断一颗二叉树是否对称

(2014-08-23 15:14:28)
标签:

it

对称二叉树:将一棵二叉树沿着根节点对折,如果两棵子树完全重合(对称节点要么都为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;

}

 

方法二:先根遍历判断二叉树是否对称

      左子树:遍历顺序为,父节点--左子节点--右子节点。

       右子树:遍历顺序为,父节点--右子节点--左子节点。

       对两个子树以相同速率,同时进行遍历,判断每一个对称节点是否重合。

 代码略。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有