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


    输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
    要求不能创建任何新的结点,只调整指针的指向。
    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:构造二叉查找树;
    // 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<<" ";
     
    }
    /************************************************************************/
    要么庸俗、要么孤独
  • 相关阅读:
    Unity3D之Character Controller(CC)与GameObject的碰撞方法
    Unity3D之资源问题处理
    Unity3D之多个fbx导入场景, 合并多个动画
    Unity3D性能优化--- 收集整理的一堆
    批量删除
    Unity3D插件之Easy Touch 3.1(1): Easy Joystick
    Unity3D与iOS消息交互方法(1)--iOS接收Unity3D发出的消息
    爬虫 requests 模块
    Flask 模型操作
    11.4 Flask session,闪现
  • 原文地址:https://www.cnblogs.com/tonz/p/5198093.html
Copyright © 2020-2023  润新知