zoukankan      html  css  js  c++  java
  • 海涛老师的面试题作业27二叉搜索树与双向链表

    View Code
      1 // 二叉搜索树转双向链表.cpp : 定义控制台应用程序的入口点。
      2 //
      3 
      4 #include "stdafx.h"
      5 #include <iostream>
      6 using namespace std;
      7 
      8 
      9 /*************************************************
     10 设计者:cslave
     11 版本说明:本代码免费用于商用,拷贝,转移,使用,但是
     12 有本代码导致的问题,本人概不负责。
     13 设计时间:2012.6.25
     14 分发原则:遵守GNU规范。
     15 **************************************************/
     16 
     17 
     18 /**************************************************
     19 
     20 设计一套接口,在这里让我们回忆下之前在链表那章实现的
     21 代码,他有一个非常好玩的接口,反应一个设计哲学,首先
     22 是创建一个链表节点,然后是将两个节点发生关系。就是先
     23 创建一个节点,然后将节点间的关系添加进来。
     24 
     25 下面我们将仿照这种设计方案,设计出自己二叉搜索书结构
     26 首先创建二叉树节点,然后将二叉树节点间发生关系,有区
     27 别的是,链表是两者之间的关系,而二叉树是三者之间的关系
     28 
     29 ***************************************************/
     30 
     31 
     32 
     33 
     34 struct BinaryNode
     35 {
     36     int  m_nValue;
     37     BinaryNode* m_pLeft;
     38     BinaryNode* m_pRight;
     39 };
     40 
     41 
     42 BinaryNode* CreateNode(int Value) //创建单个的树节点
     43 {
     44     BinaryNode* pNode=new BinaryNode();
     45     pNode->m_nValue=Value;
     46     pNode->m_pLeft=NULL;
     47     pNode->m_pRight=NULL;
     48     return pNode;
     49 }
     50 
     51 void ConnectBinaryNode(BinaryNode* pParent,BinaryNode* pLeftChild,BinaryNode* pRightChild)
     52 {
     53     if(pParent==NULL)
     54         throw exception("ConnectBinaryNode Failed ! pParent is NULL!\n");
     55     else
     56     {
     57         pParent->m_pLeft=pLeftChild;
     58         pParent->m_pRight=pRightChild;
     59     }
     60 }
     61 
     62 void PrintBinaryNode(BinaryNode* pRoot)
     63 {
     64     if(pRoot)
     65     {
     66         cout<<"The Value Of The Node Is"<<pRoot->m_nValue<<"\t";
     67         if(pRoot->m_pLeft)
     68             cout<<"The Value Of The LeftNode Is"<<pRoot->m_pLeft->m_nValue<<"\t";
     69         else
     70             cout<<"The Value Of The LeftNode Is Empty"<<"\t";
     71         if(pRoot->m_pRight)
     72             cout<<"The Value Of The RightNode Is"<<pRoot->m_pRight->m_nValue<<"\t";
     73         else
     74             cout<<"The Value Of The RightNode Is Empty"<<"\t";
     75     }
     76     else
     77         cout<<"pRoot Is NULL";
     78     cout<<endl;
     79     return ;
     80 }
     81 
     82 void PrintBinartTree(BinaryNode* pRoot)
     83 {
     84     PrintBinaryNode(pRoot);
     85     if(pRoot)
     86     {
     87         if(pRoot->m_pLeft)
     88             PrintBinaryNode(pRoot->m_pLeft);
     89         if(pRoot->m_pRight)
     90             PrintBinaryNode(pRoot->m_pRight);
     91     }
     92 
     93 }
     94 
     95 
     96 
     97 void DestroyTree(BinaryNode* pRoot)
     98 {
     99     if(pRoot)
    100     {
    101         BinaryNode* pLeft=pRoot->m_pLeft;
    102         BinaryNode* pRight=pRoot->m_pRight;
    103         delete pRoot;
    104         DestroyTree(pLeft);
    105         DestroyTree(pRight);
    106     }
    107 
    108 }
    109 
    110 
    111 
    112 /*************************************************
    113 
    114 上述为完整的二叉搜索树的函数和数据,我们注意到除了
    115 单节点和节点关系创建之外还有三个函数,分别为打印
    116 节点和打印二叉树,还有一个销毁二叉树,总共五个函数。
    117 下面我们比较下二叉搜索树和链表的创建函数
    118 1 单节点创建   链表和二叉树都有
    119 2 节点关系创建 链表和二叉树都有
    120 3 打印单个节点 链表和二叉树都有
    121 4 打印所有节点 链表和二叉树都有
    122 5 销毁数据结构 链表和二叉树都有
    123 6 添加单个节点 链表有,而二叉树是使用节点关系来表述
    124 
    125 **************************************************/
    126 
    127 
    128 void ConvertNode(BinaryNode* pRoot,BinaryNode** pHeadOfList)
    129 {
    130     if(pRoot==NULL)
    131         return;
    132     BinaryNode* pCurrent=pRoot;
    133     if(pCurrent->m_pLeft!=NULL)
    134         ConvertNode(pCurrent->m_pLeft,pHeadOfList);
    135     pCurrent->m_pLeft=*pHeadOfList;
    136     if(*pHeadOfList!=NULL)
    137         (*pHeadOfList)->m_pRight=pCurrent;
    138     *pHeadOfList=pCurrent;
    139     if(pCurrent->m_pRight!=NULL)
    140         ConvertNode(pCurrent->m_pRight,pHeadOfList);
    141 }
    142 
    143 
    144 
    145 
    146 BinaryNode* Convert(BinaryNode* pRoot)
    147 {
    148     BinaryNode* pLastNode=NULL;
    149     ConvertNode(pRoot,&pLastNode);
    150     BinaryNode* pHeadOfList=pLastNode;
    151     while(pHeadOfList!=NULL&&pHeadOfList->m_pLeft!=NULL)
    152         pHeadOfList=pHeadOfList->m_pLeft;
    153     return pHeadOfList;
    154 }
    155 
    156 void PrintListNode(BinaryNode* pRoot)
    157 {
    158     if(!pRoot)
    159         return;
    160     BinaryNode* pTemp=pRoot;
    161     while(pTemp->m_pRight)
    162     {
    163         cout<<"The Value Of The ListNode Is:"<<pTemp->m_nValue<<endl;
    164         pTemp=pTemp->m_pRight;
    165     }
    166         cout<<"The Value Of The ListNode Is:"<<pTemp->m_nValue<<endl;
    167 }
    168 
    169 void Test()
    170 {
    171     BinaryNode* node1=CreateNode(10);
    172     BinaryNode* node2=CreateNode(6);
    173     BinaryNode* node3=CreateNode(14);
    174     BinaryNode* node4=CreateNode(4);
    175     BinaryNode* node5=CreateNode(8);
    176     BinaryNode* node6=CreateNode(12);
    177     BinaryNode* node7=CreateNode(16);
    178     ConnectBinaryNode(node1,node2,node3);
    179     ConnectBinaryNode(node2,node4,node5);
    180     ConnectBinaryNode(node3,node6,node7);
    181     BinaryNode* pRoot=Convert(node1);
    182     PrintListNode(pRoot);
    183 
    184 
    185     
    186 }
    187 
    188 
    189 int _tmain(int argc, _TCHAR* argv[])
    190 {
    191     Test();
    192     return 0;
    193 }
  • 相关阅读:
    SQL盲注工具BBQSQL
    嗅探X-Windows服务按键工具xspy
    多协议底层攻击工具Yesinia
    LLMNR欺骗工具Responder
    Arduino可穿戴教程保存源文件与打开已经存在的源文件
    GRDB使用SQLite的WAL模式
    CString之GetBuffer与ReleaseBuffer
    VC++ 模块与资源分离
    KV6.60 SP1
    Html之head部分详解
  • 原文地址:https://www.cnblogs.com/cslave/p/2571025.html
Copyright © 2011-2022 走看看