• 海涛老师的面试题作业6重建二叉树


    View Code
      1 // 重建二叉树.cpp : 定义控制台应用程序的入口点。
      2 //
      3 
      4 #include "stdafx.h"
      5 #include <iostream>
      6 using namespace std;
      7 
      8 
      9 struct BinaryTreeNode
     10 {
     11     int m_nValue;
     12     BinaryTreeNode* m_pLeft;
     13     BinaryTreeNode* m_pRight;
     14 };
     15 
     16 
     17 
     18 BinaryTreeNode* ConstructCore(int* StartPreorder,int* EndPreorder,int* StartInorder,int* EndInorder)
     19 {
     20     int RootValue=StartPreorder[0];
     21     BinaryTreeNode*  Root=new BinaryTreeNode();
     22     Root->m_nValue=RootValue;
     23     Root->m_pLeft=Root->m_pRight=NULL;
     24     if(StartPreorder==EndPreorder)
     25     {
     26         if(StartInorder==EndInorder&&*StartPreorder==*StartInorder)
     27         {
     28             return Root;
     29         }
     30         else
     31         {
     32             throw exception("Invalid Input!");
     33         }
     34     }
     35     int* RootInorder=StartInorder;
     36     while(RootInorder<=EndInorder&&*RootInorder!=RootValue)
     37         ++RootInorder;
     38     if(RootInorder==EndInorder&&*RootInorder!=RootValue)
     39         throw exception("Invalid Input!");
     40     int LeftLength=RootInorder-StartInorder;
     41     int* LeftPreorderEnd=StartPreorder+LeftLength;
     42     if(LeftLength>0)
     43     {
     44         Root->m_pLeft=ConstructCore(StartPreorder+1,LeftPreorderEnd,StartInorder,RootInorder-1);
     45     }
     46     if(LeftLength<EndPreorder-StartPreorder)
     47     {
     48         Root->m_pRight=ConstructCore(LeftPreorderEnd+1,EndPreorder,RootInorder+1,EndInorder);
     49     }
     50     return Root;
     51 }
     52 
     53 
     54 BinaryTreeNode* Construct(int* preorder,int*inorder,int length)
     55 {
     56     if(preorder==NULL||inorder==NULL||length<=0)
     57         return NULL;
     58     return ConstructCore(preorder,preorder+length-1,inorder,inorder+length-1);
     59 }
     60 
     61 
     62 void PrintTree(BinaryTreeNode* Head)
     63 {
     64     if(Head)
     65     {
     66     if(Head->m_pLeft)
     67         PrintTree(Head->m_pLeft);
     68     if(Head->m_pRight)
     69         PrintTree(Head->m_pRight);
     70         cout<<Head->m_nValue<<"  ";
     71     }
     72     else
     73         return;
     74 }
     75 
     76 void DestroyTree(BinaryTreeNode* Head)
     77 {
     78     if(Head)
     79     {
     80     if(Head->m_pLeft)
     81         DestroyTree(Head->m_pLeft);
     82     else if(Head->m_pRight)
     83         DestroyTree(Head->m_pRight);
     84     delete Head;
     85     }
     86     else
     87         return;
     88 }
     89 
     90 
     91 void Test(char* testName, int* preorder, int* inorder, int length)
     92 {
     93     if(testName != NULL)
     94         printf("%s begins:\n", testName);
     95 
     96     printf("The preorder sequence is: ");
     97     for(int i = 0; i < length; ++ i)
     98         printf("%d ", preorder[i]);
     99     printf("\n");
    100 
    101     printf("The inorder sequence is: ");
    102     for(int i = 0; i < length; ++ i)
    103         printf("%d ", inorder[i]);
    104     printf("\n");
    105 
    106     try
    107     {
    108         BinaryTreeNode* root = Construct(preorder, inorder, length);
    109         PrintTree(root);
    110         cout<<endl;
    111         DestroyTree(root);
    112     }
    113     catch(exception& exception)
    114     {
    115         printf("Invalid Input.\n");
    116     }
    117 }
    118 
    119 
    120 // 普通二叉树
    121 //              1
    122 //           /     \
    123 //          2       3  
    124 //         /       / \
    125 //        4       5   6
    126 //         \         /
    127 //          7       8
    128 
    129 void Test1()
    130 {
    131     const int length = 8;
    132     int preorder[length] = {1, 2, 4, 7, 3, 5, 6, 8};
    133     int inorder[length] = {4, 7, 2, 1, 5, 3, 8, 6};
    134 
    135     Test("Test1", preorder, inorder, length);
    136 }
    137 
    138 
    139 // 所有结点都没有右子结点
    140 //            1
    141 //           / 
    142 //          2   
    143 //         / 
    144 //        3 
    145 //       /
    146 //      4
    147 //     /
    148 //    5
    149 void Test2()
    150 {
    151     const int length = 5;
    152     int preorder[length] = {1, 2, 3, 4, 5};
    153     int inorder[length] = {5, 4, 3, 2, 1};
    154 
    155     Test("Test2", preorder, inorder, length);
    156 }
    157 
    158 // 所有结点都没有左子结点
    159 //            1
    160 //             \ 
    161 //              2   
    162 //               \ 
    163 //                3 
    164 //                 \
    165 //                  4
    166 //                   \
    167 //                    5
    168 void Test3()
    169 {
    170     const int length = 5;
    171     int preorder[length] = {1, 2, 3, 4, 5};
    172     int inorder[length] = {1, 2, 3, 4, 5};
    173 
    174     Test("Test3", preorder, inorder, length);
    175 }
    176 
    177 // 树中只有一个结点
    178 void Test4()
    179 {
    180     const int length = 1;
    181     int preorder[length] = {1};
    182     int inorder[length] = {1};
    183 
    184     Test("Test4", preorder, inorder, length);
    185 }
    186 
    187 // 完全二叉树
    188 //              1
    189 //           /     \
    190 //          2       3  
    191 //         / \     / \
    192 //        4   5   6   7
    193 void Test5()
    194 {
    195     const int length = 7;
    196     int preorder[length] = {1, 2, 4, 5, 3, 6, 7};
    197     int inorder[length] = {4, 2, 5, 1, 6, 3, 7};
    198 
    199     Test("Test5", preorder, inorder, length);
    200 }
    201 
    202 // 输入空指针
    203 void Test6()
    204 {
    205     Test("Test6", NULL, NULL, 0);
    206 }
    207 
    208 // 输入的两个序列不匹配
    209 void Test7()
    210 {
    211     const int length = 7;
    212     int preorder[length] = {1, 2, 4, 5, 3, 6, 7};
    213     int inorder[length] = {4, 2, 8, 1, 6, 3, 7};
    214 
    215     Test("Test7: for unmatched input", preorder, inorder, length);
    216 }
    217 
    218 
    219 
    220 
    221 
    222 
    223 int _tmain(int argc, _TCHAR* argv[])
    224 {
    225     Test1();
    226     Test2();
    227     Test3();
    228     Test4();
    229     Test5();
    230     Test6();
    231     Test7();
    232     return 0;
    233 }
  • 相关阅读:
    【11.5】生成器进阶--send、close和throw方法
    【11.4】协程是什么?
    【python】IO多路复用(select、poll、epoll)介绍及select、epoll的实现
    【11.3】select+回调+事件循环获取html
    【11.2】C10K问题和io多路复用(select、poll和epoll)
    【11.1】并发、并行、同步、异步、阻塞、非阻塞
    【10.10】进程间通信--Queue、Pipe、Manager
    set autotrace on 报cannot set autotrace 错误解决方法
    通配符获取文件
    日期函数
  • 原文地址:https://www.cnblogs.com/cslave/p/2563683.html
Copyright © 2020-2023  润新知