zoukankan      html  css  js  c++  java
  • 面试题27.二叉搜索树与双向链表

    题目:输入一颗二叉搜索树,将该二叉搜索树转换为一个排序的双向链表。要求不能创建

    任何新的结点,只能调整树种结点指针的指向。比如输入下图的二叉搜索树,则输出转换

    后的双向排序链表。

    1             10
    2           /    
    3         6      14
    4        /      /  
    5       4   8   12  16

    转换后的双向排序链表为:

    1 4<--->6<--->8<--->10<--->12<--->14<--->16

    首先 要明白二叉搜索树是根结点大于左子结点,小于右子结点 

    然而要让转换后的双向链表基本有序,则应该中序遍历该二叉树

    遍历的时候将树看成三部分:值为10的根结点,根结点值为6的左

    子树,根结点值为14的右子树。根据排序链表的定义。值为10的

    结点将和左子树的最大的结点链接起来,同时该结点还要和右子树

    最小的结点链接起来。

    然而对于左子树和右子树,递归上述步骤即可。

    代码实现如下:

      1 #include <iostream>
      2 using namespace std;
      3 
      4 struct BinaryTreeNode
      5 {
      6     int        m_nValue;
      7     BinaryTreeNode* m_pLeft;
      8     BinaryTreeNode* m_pRight;
      9 };
     10 
     11 void ConvertNode(BinaryTreeNode* pNode,BinaryTreeNode** pLastNodeInlist)
     12 {
     13     if(pNode==NULL)
     14         return;
     15 
     16     BinaryTreeNode *pCurrent = pNode;
     17 
     18     if(pCurrent->m_pLeft!=NULL)
     19         ConvertNode(pCurrent->m_pLeft,pLastNodeInlist);
     20 
     21     pCurrent->m_pLeft=*pLastNodeInlist;
     22 
     23     if(*pLastNodeInlist!=NULL)
     24         (*pLastNodeInlist)->m_pRight=pCurrent;
     25 
     26     *pLastNodeInlist=pCurrent;
     27 
     28     if(pCurrent->m_pRight!=NULL)
     29         ConvertNode(pCurrent->m_pRight,pLastNodeInlist);
     30 }
     31 
     32 
     33 
     34 BinaryTreeNode* Convert(BinaryTreeNode* pRootOfTree)
     35 {
     36     BinaryTreeNode *pLastNodeInList = NULL;
     37     ConvertNode(pRootOfTree,&pLastNodeInList);
     38 
     39     BinaryTreeNode *pHeadOfList = pLastNodeInList;
     40     while(pHeadOfList != NULL&&pHeadOfList->m_pLeft!=NULL)
     41         pHeadOfList = pHeadOfList->m_pLeft;
     42 
     43     return pHeadOfList;
     44 }
     45 
     46 void CreateTree(BinaryTreeNode** Root)
     47 {
     48      int data;
     49      cin>>data;
     50      if(data==0)
     51      {
     52         *Root=NULL;
     53          return ;
     54      }
     55      else
     56      {
     57          *Root=(BinaryTreeNode*)malloc(sizeof(BinaryTreeNode));
     58          (*Root)->m_nValue=data;
     59          CreateTree(&((*Root)->m_pLeft));    
     60          CreateTree(&((*Root)->m_pRight));
     61      }
     62 }
     63 
     64 void PrintTreeInOrder(BinaryTreeNode* Root)
     65 {
     66     if(Root==NULL)
     67     {
     68         return;
     69     }
     70     cout<<Root->m_nValue<<" ";
     71     PrintTreeInOrder(Root->m_pLeft);
     72     PrintTreeInOrder(Root->m_pRight);
     73 
     74 }
     75 
     76 void PrintTheLinkList(BinaryTreeNode *Head)
     77 {
     78     cout<<"从前往后变量该双向链表: ";
     79     while(Head->m_pRight!=NULL)
     80     {
     81         cout<<Head->m_nValue<<" ";
     82         Head=Head->m_pRight;
     83     }
     84     cout<<Head->m_nValue<<" ";
     85     cout<<endl;
     86     BinaryTreeNode *Last=Head;
     87     cout<<"从后往前变量该双向链表: ";
     88     while(Last!=NULL)
     89     {
     90         cout<<Last->m_nValue<<" ";
     91         Last=Last->m_pLeft;
     92     }
     93 }
     94 
     95 int main()
     96 {
     97     BinaryTreeNode* Root;
     98     CreateTree(&Root);
     99     cout<<"The InOrderOfTree: ";
    100     PrintTreeInOrder(Root);
    101     cout<<endl;
    102     BinaryTreeNode* HeadOfLinkList;
    103     HeadOfLinkList=Convert(Root);
    104     cout<<endl;
    105     PrintTheLinkList(HeadOfLinkList);
    106     cout<<endl;
    107     system("pause");
    108     return 0;
    109 }

    运行截图:

  • 相关阅读:
    第五篇
    第四篇
    PAT Basic 1094 谷歌的招聘 (20 分)
    PAT Basic 1093 字符串A+B (20 分)
    Dubbo 04 服务化最佳实现流程
    Dubbo 03 Restful风格的API
    Dubbo 02 微信开发
    Dubble 01 架构模型&start project
    PAT Basic 1020 月饼 (25 分)
    PAT Basic 1019 数字黑洞 (20 分)
  • 原文地址:https://www.cnblogs.com/vpoet/p/4770868.html
Copyright © 2011-2022 走看看