二元查找树-- 转化为双向链表

/*
把二叉查找树转化为双向链表
什么是二元查找树?
  二元查找树: 它首先要是一棵二元树,在这基础上它或者是一棵空树;或者是具有下列性质的二元树:
   (1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
   (2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;
   (3)左、右子树也分别为二元查找树
*/


#include <iostream>
using namespace std;

struct BSTreeNode
{
    BSTreeNode *left;
    BSTreeNode *right;
    int value;
    BSTreeNode()
    {
        left = NULL;
        right = NULL;
    }
};

typedef BSTreeNode DoubleList;
DoubleList *pHead;            //双向链表的头部
DoubleList *pListIndex;       //双向链表的索引
 
//建立二元查找树
void AddNode(BSTreeNode * &pCurrent, int v)
{
     if (NULL == pCurrent)
     {
          BSTreeNode *temp = new BSTreeNode();
          temp->value = v;
          pCurrent = temp;
          
     }
     else
     {
          if (v < (pCurrent->value))
          {
               AddNode(pCurrent->left, v);     
          }
          else if (v > (pCurrent->value))
          {
               AddNode(pCurrent->right, v);
          }
          else
          {
              //增加重复的结点
          }
     }
}

void AddToDoubleList(BSTreeNode *pNode)
{
     if (pHead == NULL)
     {
         pHead = pNode;
     }
     else
     {
         pNode->left = pListIndex;
         pListIndex->right = pNode;
     }
     pListIndex = pNode;
}

//中序遍历二元查找数   顺序访问
void Mid(BSTreeNode *pNode)
{
     if(pNode == NULL)
     {
         return;
     }
     Mid(pNode->left);
     /// cout << pNode->value << " ";
     AddToDoubleList(pNode);
     Mid(pNode->right);
}

void Display(DoubleList *pList)
{
     for (BSTreeNode *pNode = pList; pNode; pNode = pNode -> right)
     {
          cout << pNode->value << " ";
     }
     cout << endl;
}

int main()
{
    BSTreeNode *root = NULL;
    pHead = NULL;
    pListIndex = NULL;
    int n;
    int value[100];
    while(scanf("%d", &n)!=EOF)
    {
       for(int i=0; i<n; i++)

       {           

              cin >> value[i];

          }
       for (int i = 0; i < n; i++)
       {    
          AddNode(root, value[i]);    
       }
       Mid(root);        //通过中序遍历把二叉查找树转化为双向链表  
       Display(pHead);   //输出该双向链表
    }
}

/*

6 2 4 1 9 10 5
1 2 4 5 9 10

*/




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值