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


    // 1:构造二叉查找树;
    // 2:中序遍历二叉查找树,因此结点按从小到大顺序访问,假设之前访问过的结点已经调整为一个双向链表,那么
    // 只需要将当前结点连接至双向链表的最后一个结点即可,访问完后,双向链表也就调整完了
    #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
    };
    
    void addBSTreeNode(BSTreeNode *&pCurrent,int value);
    void inOrderBSTree(BSTreeNode* pBSTree);
    void convertToDoubleList(BSTreeNode* pCurrent);
    
    BSTreeNode *pHead=NULL;//指向循环队列头结点
    BSTreeNode *pIndex=NULL;//指向前一个结点
    
    int main()
    {
        BSTreeNode *pRoot=NULL;
        addBSTreeNode(pRoot,10);
        addBSTreeNode(pRoot,6);
        addBSTreeNode(pRoot,14);
        addBSTreeNode(pRoot,4);
        addBSTreeNode(pRoot,8);
        addBSTreeNode(pRoot,12);
        addBSTreeNode(pRoot,16);
        inOrderBSTree(pRoot);
        return 0;
    }
    /************************************************************************/
    /* 建立二叉排序树 */
    void addBSTreeNode(BSTreeNode *&pCurrent,int value)//在这个函数中会要改变指针值,一定要记得使用引用传递
    {
        if (pCurrent==NULL)
        {
            BSTreeNode* pBSTree=new BSTreeNode();
            pBSTree->m_nValue=value;
            pBSTree->m_pLeft=NULL;
            pBSTree->m_pRight=NULL;
            pCurrent=pBSTree;
        }
        else if (pCurrent->m_nValue<value)
        {
            addBSTreeNode(pCurrent->m_pRight,value);
        }
        else if (pCurrent->m_nValue>value)
        {
            addBSTreeNode(pCurrent->m_pLeft,value);
        }
        else
        {
            cout<<"node repeated"<<endl;
        }
    
    }
    /************************************************************************/
    
    /************************************************************************/
    /* 中序遍历二叉树,同时调整结点指针 */
    void inOrderBSTree(BSTreeNode* pBSTree)
    {
    
        if (NULL==pBSTree)
        {
            return;
        }
        if (NULL!=pBSTree->m_pLeft)
        {
            inOrderBSTree(pBSTree->m_pLeft);
        }
    
        // if (NULL!=pBSTree)
        // {
                // cout<<pBSTree->m_nValue;
        // }
        convertToDoubleList(pBSTree);
    
        if (NULL!=pBSTree->m_pRight)
        {
            inOrderBSTree(pBSTree->m_pRight);
        }
    
    }
    /************************************************************************/
    
    /************************************************************************/
    /* 调整结点指针 */
    void convertToDoubleList(BSTreeNode* pCurrent)
    {
        pCurrent->m_pLeft=pIndex;//使当前结点的左指针指向双向链表中最后一个结点
        if (NULL==pIndex)//若最后一个元素不存在,此时双向链表尚未建立,因此将当前结点设为双向链表头结点
        {
            pHead=pCurrent;
        }
        else//使双向链表中最后一个结点的右指针指向当前结点
        {
            pIndex->m_pRight=pCurrent;
        }
    
        pIndex=pCurrent;//将当前结点设为双向链表中最后一个结点
    
        cout<<pCurrent->m_nValue<<" ";
    
    }
    /************************************************************************/                        
  • 相关阅读:
    非阻塞式NIO 小案例(模拟聊天室)
    网络通信小案例,服务端接收成功要给客户端一个反馈(阻塞式)
    阻塞式网络通信小案例:
    NIO的非阻塞式网络通信
    字符编码
    使用分散(Scatter)与聚集(Gather)来实现文件的复制
    使用通道之间的数据传输(效果,也是实现文件的复制)
    创建直接缓存区完成文件的复制
    C++预处理详解
    C++的学习资源
  • 原文地址:https://www.cnblogs.com/liyanfasd/p/3070437.html
Copyright © 2020-2023  润新知