• 【Data structure & Algorithm】把二元查找树转变成排序的双向链表


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

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

    比如将二元查找树

                       10

                      /      

                    6        14

                   /         /    

                  4   8   12   16

    转换成双向链表4=6=8=10=12=14=16

    分析:

    思路一:当到达某一节点准备调整以该节点为根节点的子树时,先调整其左子树将左子树转换成一个排好序的左子链表,再调整其右子树转换右子链表。最近链接左子链表的最右节点(左子树的最大节点)、当前节点和有子链表的最左节点(右子树的最小节点)。从树的根节点开始递归调整所有节点。

    首先定义二元查找树的数据结构如下:

    structBSTreeNode

    {

           int m_nValue;

       BSTreeNode *m_pLeft;

       BSTreeNode *m_pRight;

    BSTreeNode*ConvertNode(BSTreeNode* pNode, bool asRight)
    {
           if (!pNode)
                  returnNULL;
           BSTreeNode *pLeft = NULL;
           BSTreeNode* pRight = NULL;
     
           //Convert the left sub-tree
           if(pNode -> m_pLeft)
                  pLeft = ConvertNode(pNode ->m_pLeft, false);
     
           //Convert the greatest node in the leftsub-tree to the current node
           if (pLeft)
           {
                  pLeft -> m_pRight = pNode;
                  pNode -> m_pLeft = pLeft;
    }
    
    //Convert the right sub-tree
    if (pNode -> m_pRight)
       	pRight= ConvertNode (pNode -> m_pRight, true);
    
    //Connect the least node in the rightsub-tree to the current node
    if (pRight)
    {
           pNode-> m_pRight = pRight;
           pRight-> m_pLeft = pNode;
    }
    
    BSTreeNode *pTemp = pNode;
    
    //If the current node is the right child ofits parent, return the least node in the tree whose root is the current node
    if (asRight)
    {
           while(pTemp -> m_pLeft)
                 pTemp= pTemp -> m_pLeft;
    }
    //if the current node is the left child ofits parent, return the greatest node in the tree whose root is the current node
    else
    {
           while(pTemp -> m_pRight)
                 pTemp= pTemp -> m_pRight;
    }
    return pTemp;
    
    //Convert a BSTree into a sorteddouble-linked list
    BSTreeNode* Convert(BSTreeNode* pHeadOfTree)
    {
           returnConvertNode(pHeadOfTree, true);
    }
    
    


    思路二:中序遍历二叉树。较小节点先访问。如果访问一个节点,假设之前访问过的节点已经调整成一个排序的双向链表,再把调整当前节点的指针将其连接到链表末尾,当所有节点都访问过之后,整棵树也就转换为一个排序的双向链表了。

    voidConvertNode(BSTreeNode* pNode, BSTreeNode*& pLastNodeInList)
    {
           if(pNode ==NULL)
                  return;
           BSTreeNode *pCurrent = pNode;
     
           //Convert the left sub-tree
           if (pCurrent -> m_pLeft !=NULL)
                  ConvertNode(pCurrent-> m_pLeft, pLastNodeInList);
     
           //Put the current node into thedouble-linked list
           pCurrent -> m_pLeft = pLastNodeInList;
           if(pLastNodeInList != NULL)
           pLastNodeInList-> m_pRight = pCurrent;
     
    pLastNodeInList = pCurrent;
     
    //Convert the right sub-tree
    if (pCurrent -> m_pRight != NULL)
           ConvertNode(pCurrent-> m_pRight, pLastNodeInList);
    
    //Convert a BSTree into a sorteddouble-linked list
    BSTreeNode* Convert_Solution(BSTreeNode*pHeadOfTree)
    {
           BSTreeNode*pLastNodeInList = NULL;
           ConvertNode(pHeadOfTree,pLastNodeInList);
    
           //Getthe head of the double-linked list
           BSTreeNode*pHeadOfList = pLastNodeInList;
           while(pHeadOfList && pHeadOfList -> m_pLeft)
                  pHeadOfList= pHeadOfList -> m_pLeft;
    
           return pHeadOfList;
    }
    }

  • 相关阅读:
    Django的日志操作,记录一下自己的使用
    初学jupyter 与爬虫
    mysql的库名或者表名带空格不能删除的问题
    Linux的vim命令的快捷键
    DjangoORM相关(多表操作)
    DjangoORM相关(单表操作)
    Django模板
    Django URL相关
    Monkeyrunner学习记录之运行模拟器
    Monkeyrunner学习记录之环境搭建
  • 原文地址:https://www.cnblogs.com/DianaCody/p/5425712.html
Copyright © 2020-2023  润新知