Chinaunix首页 | 论坛 | 博客
  • 博客访问: 136165
  • 博文数量: 38
  • 博客积分: 306
  • 博客等级: 二等列兵
  • 技术积分: 335
  • 用 户 组: 普通用户
  • 注册时间: 2012-10-29 15:19
文章分类

全部博文(38)

文章存档

2013年(23)

2012年(15)

我的朋友

分类: C/C++

2013-08-09 16:12:48

题目要求:将二叉查找树转换成排序的双向链表,不能创建新节点,只调整指针。

查找树的结点定义如下:


  1. class Node  
  2. {  
  3. public:  
  4.      Node(int x):left(NULL),right(NULL),data(x){};  
  5.      Node * left;  
  6.      Node * right;  
  7.      int data;  
  8. };  


既然是树,其定义本身就是递归的,自然用递归算法处理就很容易。
将根结点的左子树和右子树转换为有序的双向链表,然后根节点的left指针指向左子树结果的最后一个结点,同时左子树最后一个结点的right指针指向根节点;根节点的right指针指向右子树结果的第一个结点,同时右子树第一个结点的left指针指向根节点。

  1. /* 
  2. 参数: 
  3. 结点的指针,以r所指结点为根节点的树转换成双向链表后, 
  4. 链表第一个结点的指针first,链表最后一个结点的指针last 
  5. */  
  6. void Convert(Node * r,Node * & first,Node * & last)  
  7. {  
  8.     //左子树和右子树结果的指针  
  9.     Node *firstL,*lastL,*firstR,*lastR;  
  10.     if(r==NULL) return;  
  11.     Convert(r->left,firstL,lastL);  
  12.     Convert(r->right,firstR,lastR);  
  13.       
  14.     if(r->left==NULL)  
  15.     {  
  16.         /*如果左子树是空的,那么以r所指结点为根结点的树 
  17.         转换结果的第一个结点的指针就是r*/  
  18.         first=r;  
  19.         r->left=NULL;  
  20.     }  
  21.     else  
  22.     {  
  23.         /*以r所指结点为根节点的树转换成双向链表后,链表第一个结点的指针first 
  24.         就是左子树结果的第一个结点的指针firstL*/  
  25.         first=firstL;  
  26.         /*r->left指向左子树结果的最后一个结点, 
  27.         同时左子树最后一个结点的right指针指向r所指结点*/  
  28.         r->left=lastL;  
  29.         lastL->right=r;  
  30.     }  
  31.     if(r->right==NULL)  
  32.     {  
  33.         /*如果右子树是空的,那么以r所指结点为根结点的树 
  34.         转换结果的最后一个结点的指针就是r*/  
  35.         last=r;  
  36.         r->right=NULL;  
  37.     }  
  38.     else  
  39.     {  
  40.         /*以r所指结点为根节点的树转换成双向链表后,链表最后一个结点的指针last 
  41.         就是右子树结果的最后一个结点的指针lastR*/  
  42.         last=lastR;  
  43.         /*r->right向右子树结果的第一个结点, 
  44.         同时右子树第一个结点的right指针指向r所指结点*/  
  45.         r->right=firstR;  
  46.         firstR->left=r;  
  47.     }  
  48. }
阅读(1719) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~