zoukankan      html  css  js  c++  java
  • 微软面试题第一道题(将二元查找树转化为双向链表)

    #include "stdio.h"
    #include<malloc.h>
    typedef struct BSTreeNode
    {
     int m_nValue;
     struct BSTreeNode *m_pLeft;
     struct BSTreeNode *m_pRight;    
    }BSTreeNode,*BStd;
    BSTreeNode *pHead=NULL;//保存当前访问节点的前一个节点  
    BSTreeNode *pIndex=NULL;//保存当前访问节点的前一个节点  
    void  TraverseBSTreeNode(BStd root)
    {
      if(root)
      {
          
        printf("%d",root->m_nValue);
        TraverseBSTreeNode(root->m_pLeft);
        TraverseBSTreeNode(root->m_pRight);
      }  
    }
    void TraverseLinkedList()
    {
     int i;
     for(i=0;i<4;i++)
     {
       printf("%d",pHead->m_nValue);
       pHead=pHead->m_pRight;
     }
    }
    BStd insertBSTreeNode(BStd root,int value)
    {
      if(value<root->m_nValue)
      {
        if(root->m_pLeft==NULL){
           BStd p=(BStd)malloc(sizeof(BSTreeNode));   
           p->m_pLeft=NULL;
           p->m_pRight=NULL;
           p->m_nValue=value;  
           root->m_pLeft=p;                                    
        }else
          insertBSTreeNode(root->m_pLeft,value);  
      }else if(value>root->m_nValue){
        if(root->m_pRight==NULL){
           BStd p=(BStd)malloc(sizeof(BSTreeNode));   
           p->m_pLeft=NULL;
           p->m_pRight=NULL;
           p->m_nValue=value;  
           root->m_pRight=p;                                     
        }else
           insertBSTreeNode(root->m_pRight,value);
      }else{
            printf("已经存在,不需要创建\n.");
      }
      return root;
    
    }
    //转化本质上就是树的中序遍历 
    void  treeToLinkedList(BSTreeNode *bd)
    {
       if(bd==NULL)
          return ;               
      if(bd->m_pLeft!=NULL)
          treeToLinkedList(bd->m_pLeft);
         
      bd->m_pLeft=pIndex;//将当前访问节点的左指针指向前一个节点 
      if(NULL==pIndex)//如果前一个节点是空,说明是第一次访问  
         pHead=bd;//此时的节点应作为双向链表的表头节点  
      else
          pIndex->m_pRight=bd;
      pIndex=bd;
      if(bd->m_pRight!=NULL)
        treeToLinkedList(bd->m_pRight);
    }
    int main()
    {
      //先创建了一个节点 
      BStd root=(BStd)malloc(sizeof(BSTreeNode));
      root->m_pLeft=NULL;
      root->m_pRight=NULL;
      scanf("%d",&root->m_nValue);
      int i=0;
      int value;
      for(;i<3;i++)
      {
         scanf("%d",&value);  
         printf("%d\n",value);      
         root=insertBSTreeNode(root,value);  
        // TraverseBSTreeNode(root);
         
         TraverseBSTreeNode(root);
         printf("\n"); 
        // printf("%d\n",root->m_nValue);       
      } 
      treeToLinkedList(root);
      printf("\n");
      TraverseLinkedList();
      system("pause"); 
    }
  • 相关阅读:
    排序应用于链表
    线性时间排序算法
    排序算法
    2017计蒜客蓝桥杯模拟赛5
    第六届河南省赛 River Crossing 简单DP
    POJ 3061 Subsequence 尺取法 POJ 3320 Jessica's Reading Problem map+set+尺取法
    天梯赛 L2-020. 功夫传人 BFS
    天梯赛 L2-019. 悄悄关注 map
    配置在Chrome,Firefox中打开
    http响应状态码大全
  • 原文地址:https://www.cnblogs.com/moshang/p/3950962.html
Copyright © 2011-2022 走看看