把二元查找树转变成排序的双向链表,要求输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表

题目:

把二元查找树转变成排序的双向链表,要求输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
题目来自:http://topic.csdn.net/u/20101023/20/5652ccd7-d510-4c10-9671-307a56006e6d.html

 

思路:
一看到这样的问题首先想到的是二叉树的遍历问题,具体是前序,中序,后序遍历主要是看问题如何描述,而这里刚好可以用中序遍历,在遍历的过程中不断的调整Left,Right指针,使之满足要求.

 

 

下面给出算法的实现:

  1. /* 
  2. --------------------------------------------- 
  3. 原作者tree_star 
  4. 2010年 10月18日下午 July 
  5. Modified by yuucyf 2011.04.21 
  6. --------------------------------------------- 
  7. 1.把二元查找树转变成排序的双向链表 
  8. 题目: 
  9. 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。 
  10. 要求不能创建任何新的结点,只调整指针的指向。 
  11.     
  12.    10 
  13.    / / 
  14.   6  14 
  15.  / / / / 
  16. 4  8 12 16 
  17.   / / 
  18.  7   9 
  19.  
  20.  转换成双向链表 
  21.  4=6=7=8=9=10=12=14=16。 
  22. */  
  23.   
  24. #include "stdafx.h"   
  25. #include <assert.h>   
  26. #include <iostream>   
  27. using namespace std;  
  28.   
  29. typedef struct tagTreeNode  
  30. {  
  31.     int nValue;  
  32.     tagTreeNode *psLeftNode;  
  33.     tagTreeNode *psRightNode;  
  34.   
  35.     tagTreeNode()  
  36.     {  
  37.         nValue = 0;  
  38.         psLeftNode = psRightNode = NULL;  
  39.     }  
  40. }S_BSTreeNode;  
  41.   
  42. typedef S_BSTreeNode S_DoubleListNode;  
  43. S_DoubleListNode * g_psListIndex = NULL;  
  44.   
  45.   
  46. //创建二叉查找树.   
  47. void  AddBSTreeNode(S_BSTreeNode * &psCurNode, int nValue)  
  48. {  
  49.     if (NULL == psCurNode)  
  50.     {  
  51.         S_BSTreeNode *psNode = new S_BSTreeNode;  
  52.         assert(NULL != psNode);  
  53.         psNode->nValue = nValue;  
  54.         psNode->psLeftNode = NULL;  
  55.         psNode->psRightNode = NULL;  
  56.         psCurNode = psNode;  
  57.     }  
  58.     else  
  59.     {  
  60.         if (psCurNode->nValue > nValue)  
  61.         {  
  62.             AddBSTreeNode(psCurNode->psLeftNode, nValue);  
  63.         }  
  64.         else if (psCurNode->nValue < nValue)  
  65.         {  
  66.             AddBSTreeNode(psCurNode->psRightNode, nValue);  
  67.         }  
  68.         else  
  69.         {  
  70.             cout << "不允许插入重复值" << endl;  
  71.         }  
  72.     }  
  73. }  
  74.   
  75.   
  76. //把二叉查找树转换为Double List.   
  77. void ConvertBSTree2DoubleList(S_BSTreeNode *psCurNode)  
  78. {  
  79.     if (NULL == psCurNode)  return;  
  80.   
  81.     psCurNode->psLeftNode = g_psListIndex;  
  82.     if (NULL != g_psListIndex)  
  83.         g_psListIndex->psRightNode = psCurNode;  
  84.   
  85.     g_psListIndex = psCurNode;  
  86.   
  87.     cout << psCurNode->nValue << endl;  
  88. }  
  89.   
  90.   
  91. //以中序遍历二叉查找树.   
  92. void ErgodicBSTree(S_BSTreeNode *psCurNode)  
  93. {  
  94.     if (NULL == psCurNode)  return;  
  95.   
  96.     if (psCurNode->psLeftNode)  
  97.         ErgodicBSTree(psCurNode->psLeftNode);  
  98.   
  99.     ConvertBSTree2DoubleList(psCurNode);  
  100.   
  101.     if (psCurNode->psRightNode)  
  102.         ErgodicBSTree(psCurNode->psRightNode);  
  103. }  
  104.   
  105.   
  106.   
  107.   
  108. int _tmain(int argc, _TCHAR* argv[])  
  109. {  
  110.     S_BSTreeNode *psRoot = NULL;  
  111.   
  112.     AddBSTreeNode(psRoot, 10);  
  113.     AddBSTreeNode(psRoot, 4);  
  114.     AddBSTreeNode(psRoot, 6);  
  115.     AddBSTreeNode(psRoot, 8);  
  116.     AddBSTreeNode(psRoot, 12);  
  117.     AddBSTreeNode(psRoot, 14);  
  118.     AddBSTreeNode(psRoot, 15);  
  119.     AddBSTreeNode(psRoot, 16);  
  120.     AddBSTreeNode(psRoot, 7);  
  121.     AddBSTreeNode(psRoot, 9);  
  122.   
  123.     ErgodicBSTree(psRoot);  
  124.   
  125.     return 0;  
  126. }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值