数据结构、算法面试系列【1】

1、把二元查找树转变成排序的双向链表

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

  10
  /  \
 6  14
 / \    /  \
4 8 12 16
    
 转换成双向链表
4=6=8=10=12=14=16。
    首先我们定义的二元查找树 节点的数据结构如下:
 struct BSTreeNode
{
  int m_nValue; // value of node
  BSTreeNode *m_pLeft; // left child of node
  BSTreeNode *m_pRight; // right child of node

};


解题思路:

1、理解二元查找树:

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

2、理解了二元查找树的定义,转换为排序的双向链表就是   中序遍历二元查找树

code:

#include <stdio.h>
#include <iostream>
using namespace std;

//二元查找树节点数据结构
struct BSTreeNode
{
    int m_nValue; // value of node
    BSTreeNode *m_pLeft; // left child of node
    BSTreeNode *m_pRight; // right child of node
};

BSTreeNode *pHead;//链表头指针
BSTreeNode *pListCur;//链表尾指针

void convertDoubleList(BSTreeNode *pCur);
//创建二元查找树
void addBSTree(BSTreeNode *&pRoot,int value)
{
    if(pRoot==NULL)
    {
        BSTreeNode *pBSTree=new BSTreeNode();
        pBSTree->m_pLeft=NULL;
        pBSTree->m_pRight=NULL;
        pBSTree->m_nValue=value;
        pRoot=pBSTree;
    }else
    {
        if((pRoot->m_nValue)>value)
        {
            addBSTree(pRoot->m_pLeft,value);//插入到左子树
        }else if((pRoot->m_nValue)<value)
        {
            addBSTree(pRoot->m_pRight,value);//插入到右子树
        }else
        {
            //已经存在节点
        }

    }
}
//中序遍历
void inTraversalBSTree(BSTreeNode * pCur)
{
    if(pCur==NULL)
    {
         return;
    }

    if( (pCur->m_pLeft) != NULL)
    {
        inTraversalBSTree(pCur->m_pLeft);
    }

    convertDoubleList(pCur);//将节点插入链表尾部

    if((pCur->m_pRight)!=NULL)
    {
        inTraversalBSTree(pCur->m_pRight);
    }
}

//将节点插入链表尾部
void convertDoubleList(BSTreeNode *pCur)
{
    pCur->m_pLeft=pListCur;

    if(pListCur!=NULL)
    {
        pListCur->m_pRight=pCur;
    }else
    {
        pHead=pCur;
    }

    pListCur=pCur;

    cout<<pCur->m_nValue<<endl;
}


int main()
{
    pHead=pListCur=NULL;
    BSTreeNode *pRoot=NULL;
    addBSTree(pRoot,10);
    addBSTree(pRoot,4);
    addBSTree(pRoot,6);
    addBSTree(pRoot,8);
    addBSTree(pRoot,12);
    addBSTree(pRoot,14);
    addBSTree(pRoot,15);
    addBSTree(pRoot,16);
    inTraversalBSTree(pRoot);
    return 0;
}



申明:题目来自http://blog.csdn.net/v_JULY_v 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值