Chinaunix首页 | 论坛 | 博客
  • 博客访问: 543169
  • 博文数量: 129
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1888
  • 用 户 组: 普通用户
  • 注册时间: 2013-06-20 11:09
文章分类

全部博文(129)

文章存档

2016年(1)

2015年(5)

2014年(64)

2013年(59)

我的朋友

分类: C/C++

2013-10-07 10:31:29

描述:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。

比如将二元查找树

                                        10
                                          /    \
                                        6       14
                                      /  \     /  \
                                    4     8  12    16
转换成双向链表4=6=8=10=12=14=16

要做的工作:
1、
将输入的无序序列转换成二叉查找树。
2、中序遍历该二元查找树,并在遍历的过程中调整指针,将它调整为双向链表。

由无序序列创建二元查找树的2中方法如下:

  1. //方法1:
  2. //创建二元查找树
  3. void addBSTreeNode(BiNode *&pCurrent,int value)
  4. {
  5.     if(pCurrent==NULL)
  6.     {
  7.      BiNode *pnode=new BiNode;
  8.         pnode->m_pLeft=NULL;
  9.      pnode->m_pRight=NULL;
  10.      pnode->m_value=value;
  11.         pCurrent=pnode;
  12.     }
  13.     else
  14.     {
  15.         if((pCurrent->m_value) > value)
  16.         {
  17.      addBSTreeNode(pCurrent->m_pLeft,value);
  18.         }
  19.      else if((pCurrent->m_value) < value)
  20.         {
  21.      addBSTreeNode(pCurrent->m_pRight,value);
  22.         }
  23.      else
  24.         {
  25.      cout<<"重复节点"<<endl;
  26.         }
  27.     
  28.     }
  29. }

  30. */
    
  1. //方法二:
  2. //由无序序列创建二元查找树
  3. bool SearchBST(BiTree T,int key,BiTree f,BiTree &p)
  4. {
  5.     if(!T)
  6.     {
  7.      p=f;
  8.      return false;
  9.     }
  10.     else if(key==(T->m_value))
  11.     {
  12.      p=T;
  13.         return true;
  14.     }
  15.     else if(key<(T->m_value))
  16.      return SearchBST(T->m_pLeft,key,T,p);
  17.     else
  18.         return SearchBST(T->m_pRight,key,T,p);


  19. }


  20. bool InsertBST(BiTree &T,int key)
  21. {
  22.     if(!SearchBST(T,key,NULL,p))
  23.     {
  24.      s=(BiTree)malloc(sizeof(BiNode));
  25.      s->m_value=key;
  26.         s->m_pLeft=s->m_pRight=NULL;
  27.         if(!p)
  28.         {
  29.             T=s;
  30.         }
  31.         else if(key<p->m_value)
  32.         {
  33.          p->m_pLeft=s;
  34.         }
  35.         else
  36.             p->m_pRight=s;
  37.         return true;
  38.     }
  39.     else
  40.         return false;
  41. }
完整源代码如下:

  1. //test01.cpp
  2. #include<iostream>
  3. using namespace std;

  4. typedef struct BiNode
  5. {
  6.     BiNode *m_pLeft;
  7.     BiNode *m_pRight;
  8.     int m_value;
  9. }BiNode,*BiTree;

  10. BiNode *pHead;
  11. BiNode *pListIndex;
  12. BiTree s=NULL;
  13. BiTree p=NULL;

  14. void convertToDoubleList(BiNode *pCurrent);


  15. /*
  16. //创建二元查找树方法1:
  17. void addBSTreeNode(BiNode *&pCurrent,int value)
  18. {
  19.     if(pCurrent==NULL)
  20.     {
  21.      BiNode *pnode=new BiNode;
  22.         pnode->m_pLeft=NULL;
  23.      pnode->m_pRight=NULL;
  24.      pnode->m_value=value;
  25.         pCurrent=pnode;
  26.     }
  27.     else
  28.     {
  29.         if((pCurrent->m_value) > value)
  30.         {
  31.      addBSTreeNode(pCurrent->m_pLeft,value);
  32.         }
  33.      else if((pCurrent->m_value) < value)
  34.         {
  35.      addBSTreeNode(pCurrent->m_pRight,value);
  36.         }
  37.      else
  38.         {
  39.      cout<<"重复节点"<<endl;
  40.         }
  41.     
  42.     }
  43. }

  44. */
  45. //创建二元查找树方法二:
  46. bool SearchBST(BiTree T,int key,BiTree f,BiTree &p)
  47. {
  48.     if(!T)
  49.     {
  50.      p=f;
  51.      return false;
  52.     }
  53.     else if(key==(T->m_value))
  54.     {
  55.      p=T;
  56.         return true;
  57.     }
  58.     else if(key<(T->m_value))
  59.      return SearchBST(T->m_pLeft,key,T,p);
  60.     else
  61.         return SearchBST(T->m_pRight,key,T,p);


  62. }


  63. bool InsertBST(BiTree &T,int key)
  64. {
  65.     if(!SearchBST(T,key,NULL,p))
  66.     {
  67.      s=(BiTree)malloc(sizeof(BiNode));
  68.      s->m_value=key;
  69.         s->m_pLeft=s->m_pRight=NULL;
  70.         if(!p)
  71.         {
  72.             T=s;
  73.         }
  74.         else if(key<p->m_value)
  75.         {
  76.          p->m_pLeft=s;
  77.         }
  78.         else
  79.             p->m_pRight=s;
  80.         return true;
  81.     }
  82.     else
  83.         return false;
  84. }





  85. //中序遍历2元查找树
  86. void ergodicBSTree(BiNode *pCurrent)
  87. {
  88.     if(pCurrent==NULL)
  89.         return;
  90.     if(NULL!=pCurrent->m_pLeft)
  91.     {
  92.      ergodicBSTree(pCurrent->m_pLeft);
  93.     }

  94.     convertToDoubleList(pCurrent);

  95.     if(NULL!=pCurrent->m_pRight)
  96.     {
  97.      ergodicBSTree(pCurrent->m_pRight);
  98.     }

  99. }


  100. //转换为双向链表
  101. void convertToDoubleList(BiNode *pCurrent)
  102. {
  103.     pCurrent->m_pLeft=pListIndex;
  104.     if(NULL!=pListIndex)
  105.     {
  106.      pListIndex->m_pRight=pCurrent;
  107.     }
  108.     else
  109.     {
  110.      pHead=pCurrent;
  111.     }
  112.     pListIndex=pCurrent;
  113.     cout<<pCurrent->m_value<<endl;
  114. }


  115. int main()
  116. {
  117.     
  118.     BiNode *pRoot=NULL;
  119.     pHead=NULL;
  120.     pListIndex=NULL;

  121.     InsertBST(pRoot,4);
  122.     InsertBST(pRoot,6);
  123.     InsertBST(pRoot,7);
  124.     InsertBST(pRoot,7);
  125.     InsertBST(pRoot,9);
  126.     InsertBST(pRoot,14);
  127.     InsertBST(pRoot,8);
  128.     InsertBST(pRoot,16);
  129.     /*
  130.     addBSTreeNode(pRoot,10);
  131.     addBSTreeNode(pRoot,4);
  132.     addBSTreeNode(pRoot,6);
  133.     addBSTreeNode(pRoot,8);
  134.     addBSTreeNode(pRoot,12);
  135.     addBSTreeNode(pRoot,14);
  136.     addBSTreeNode(pRoot,15);
  137.     addBSTreeNode(pRoot,16);
  138.     */
  139.     ergodicBSTree(pRoot);
  140.     return 0;
  141. }
  运行结果如下:
   

 





 


阅读(561) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~