zoukankan      html  css  js  c++  java
  • 算法面试:精选微软等公司经典的算法面试100题 第140题

    http://topic.csdn.net/u/20101023/20/5652CCD7-D510-4C10-9671-307A56006E6D.html

    答案下载

    http://download.csdn.net/source/2796735 

    字符串相关

    http://www.cnblogs.com/wangbin_ben/archive/2010/11/12/1876097.html

    http://topic.csdn.net/u/20101126/10/B4F12A00-6280-492F-B785-CB6835A63DC9.html 

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

    程序员面试题精选(01)-把二元查找树转变成排序的双向链表
      题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。
      比如将二元查找树
                                                10
                                              /    \
                                            6       14
                                          /  \     /  \
                                        4     8  12    16


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

      分析:本题是微软的面试题。很多与树相关的题目都是用递归的思路来解决,本题也不例外。下面我们用两种不同的递归思路来分析。
       思路一:当我们到达某一结点准备调整以该结点为根结点的子树时,先调整其左子树将左子树转换成一个排好序的左子链表,再调整其右子树转换右子链表。最近 链接左子链表的最右结点(左子树的最大结点)、当前结点和右子链表的最左结点(右子树的最小结点)。从树的根结点开始递归调整所有结点。
      思路二:我们可以中序遍历整棵树。按照这个方式遍历树,比较小的结点先访问。如果我们每访问一个结点,假设之前访问过的结点已经调整成一个排序双向链表,我们再把调整当前结点的指针将其链接到链表的末尾。当所有结点都访问过之后,整棵树也就转换成一个排序双向链表了。
    参考代码:
    首先我们定义二元查找树结点的数据结构如下:
        struct BSTreeNode // a node in the binary search tree
        {
            int          m_nValue; // value of node
            BSTreeNode  *m_pLeft;  // left child of node
            BSTreeNode  *m_pRight; // right child of node
        };
    思路一对应的代码:
    ///////////////////////////////////////////////////////////////////////
    // Covert a sub binary-search-tree into a sorted double-linked list
    // Input: pNode - the head of the sub tree
    //
            asRight - whether pNode is the right child of its parent
    // Output: if asRight is true, return the least node in the sub-tree
    //
             else return the greatest node in the sub-tree
    ///////////////////////////////////////////////////////////////////////

    BSTreeNode* ConvertNode(BSTreeNode* pNode,
    bool asRight)
    {
          if(!pNode)
                return NULL;
          BSTreeNode *pLeft = NULL;
          BSTreeNode *pRight = NULL;

          // Convert the left sub-tree
          if(pNode->m_pLeft)
                pLeft = ConvertNode(pNode->m_pLeft, false);

          // Connect the greatest node in the left sub-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 right sub-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 of its 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 of its 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;

    }

    ///////////////////////////////////////////////////////////////////////
    // Covert a binary search tree into a sorted double-linked list
    // Input: the head of tree
    // Output: the head of sorted double-linked list
    ///////////////////////////////////////////////////////////////////////

    BSTreeNode* Convert(BSTreeNode* pHeadOfTree)
    {
          // As we want to return the head of the sorted double-linked list,
          // we set the second parameter to be true
          return ConvertNode(pHeadOfTree, true);
    }

    思路二对应的代码:
    ///////////////////////////////////////////////////////////////////////
    // Covert a sub binary-search-tree into a sorted double-linked list
    // Input: pNode -
               the head of the sub tree
    //
            pLastNodeInList - the tail of the double-linked list
    ///////////////////////////////////////////////////////////////////////

    void ConvertNode(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 the double-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);
    }

    ///////////////////////////////////////////////////////////////////////
    // Covert a binary search tree into a sorted double-linked list
    // Input: pHeadOfTree - the head of tree
    // Output: the head of sorted double-linked list
    ///////////////////////////////////////////////////////////////////////
    BSTreeNode* Convert_Solution1(BSTreeNode* pHeadOfTree)
    {
          BSTreeNode *pLastNodeInList = NULL;
          ConvertNode(pHeadOfTree, pLastNodeInList);

          // Get the head of the double-linked list
          BSTreeNode *pHeadOfList = pLastNodeInList;
          while(pHeadOfList && pHeadOfList->m_pLeft)
                pHeadOfList = pHeadOfList->m_pLeft;

          return pHeadOfList;
    }

    下面是我的实现(参考上面的):

    1. /* 
    2.  * convert the binary tree to double link 
    3.  * calls treeToDLink()
    4.  * return the head node of the double link
    5.  */
    6. template <class T>
    7. BinaryTreeNode<T>* BSTree<T>::convertToDLink()
    8. {
    9.     treeToDLink(root);
    10.     BinaryTreeNode<T> *linkHead = root;
    11.     while (linkHead->left)
    12.     {
    13.         linkHead = linkHead->left;
    14.     }
    15.     
    16.     return linkHead;
    17. }

    18. /* 
    19.  * transform a tree with the root of node to doule link
    20.  * called by convertToDLink()
    21.  */
    22. template <class T>
    23. void BSTree<T>::treeToDLink(BinaryTreeNode<T> *node)
    24. {
    25.     if (NULL == node)
    26.     {
    27.         return;
    28.     }
    29.     treeToDLink(node->left);
    30.     treeToDLink(node->right);
    31.     linkLeftRight(node);
    32. }

    33. /*
    34.  * link left tree and right tree in the case of they are already double link 
    35.  * called by treeToDLink()
    36.  */
    37. template <class T>
    38. void BSTree<T>::linkLeftRight(BinaryTreeNode<T> *node)
    39. {
    40.     if (NULL == node)
    41.     {
    42.         return;
    43.     }
    44.     
    45.     /* link the left tree */
    46.     BinaryTreeNode<T> *rightMost = node->left;
    47.     if (rightMost != NULL)
    48.     {
    49.         while (rightMost->right)
    50.         {
    51.             rightMost = rightMost->right;
    52.         }
    53.         rightMost->right = node;
    54.         node->left = rightMost;
    55.     }   
    56.     
    57.     /* link the right tree */
    58.     BinaryTreeNode<T> *leftMost = node->right;
    59.     if (leftMost != NULL)
    60.     {
    61.         while (leftMost->left)
    62.         {
    63.             leftMost = leftMost->left;
    64.         }
    65.         leftMost->left = node;
    66.         node->right = leftMost;
    67.     }   
    68. }


    69. /* another implemention */
    70. template <class T>
    71. void BSTree<T>::treeToDLink1(BinaryTreeNode<T> *node, BinaryTreeNode<T>*& pLast)
    72. {
    73.     if (NULL == node)
    74.     {
    75.         return;
    76.     }
    77.     /* convert the left sub tree */
    78.     treeToDLink1(node->left, pLast);

    79.     /* put the current node into the link */
    80.     node->left = pLast;
    81.     if (pLast != NULL)
    82.     {
    83.         pLast->right = node;
    84.     }
    85.     pLast = node;
    86.     /* convert the right sub tree */
    87.     treeToDLink1(node->right, pLast);
    88. }

    89. template <class T>
    90. BinaryTreeNode<T>* BSTree<T>::convertToDLink1()
    91. {
    92.     BinaryTreeNode<T> *linkHead = NULL;
    93.     treeToDLink1(root, linkHead);
    94.     while (linkHead->left)
    95.     {
    96.         linkHead = linkHead->left;
    97.     }   

    98.     return linkHead;
    99. }
     

  • 相关阅读:
    HDU 1358 Period (KMP)
    POJ 1042 Gone Fishing
    Csharp,Javascript 获取显示器的大小的几种方式
    css text 自动换行的实现方法 Internet Explorer,Firefox,Opera,Safar
    Dynamic Fonts动态设置字体大小存入Cookie
    CSS Image Rollovers翻转效果Image Sprites图片精灵
    CSS three column layout
    css 自定义字体 Internet Explorer,Firefox,Opera,Safari
    颜色选择器 Color Picker,Internet Explorer,Firefox,Opera,Safar
    CSS TextShadow in Safari, Opera, Firefox and more
  • 原文地址:https://www.cnblogs.com/likwo/p/1875731.html
Copyright © 2011-2022 走看看