zoukankan      html  css  js  c++  java
  • 04-树6 Complete Binary Search Tree

      本题要求根据输入实现一棵完美二叉搜索树并层序遍历输出。

      以下方法没有构造出树再进行遍历,而是利用完美二叉树中各结点位置的规律逐步得出要求的序列,以数组形式存放最后直接输出。

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 #include <math.h>
     4 #define MAXSIZE 1000
     5 
     6 int comp(const void *a, const void *b);
     7 void Func(int* inSeq, int* LevTrSeq, int LeftIndex, int RightIndex, int RootIndex);
     8 int GetLeftNum(int num);
     9 int Min(int a, int b);
    10 
    11 int main(int argc, char const *argv[])
    12 {
    13     int N, i;
    14     int inSeq[MAXSIZE], LevTrSeq[MAXSIZE];
    15     scanf("%d", &N);
    16     for (i = 0; i < N; i++){
    17         scanf("%d", &inSeq[i]);
    18     }
    19     qsort(inSeq, N, sizeof(int), comp);
    20     int LeftIndex = 0, RightIndex = N - 1, RootIndex = 0; 
    21     Func(inSeq, LevTrSeq, LeftIndex, RightIndex, RootIndex);
    22     printf("%d", LevTrSeq[0]);
    23     for (i = 1; i < N; i++){
    24         printf(" %d", LevTrSeq[i]);
    25     }
    26     printf("
    ");
    27     return 0;
    28 }
    29 
    30 int comp(const void *a, const void *b)
    31 {
    32     return *(int*)a - *(int*)b;
    33 }
    34 
    35 void Func(int* inSeq, int* LevTrSeq, int LeftIndex, int RightIndex, int RootIndex)
    36 {
    37     int num;  //number of elements in this sequence
    38     num = RightIndex - LeftIndex + 1;
    39     if(!num)
    40         return;
    41     int LeftNum, LeftRootIndex, RightRootIndex;  //number of nodes in left subtree; substree roots' index
    42     LeftNum = GetLeftNum(num);
    43     LevTrSeq[RootIndex] = inSeq[LeftIndex + LeftNum];
    44     LeftRootIndex = 2 * RootIndex + 1;  //完全二叉树每层最左节点的下标规律如此
    45     RightRootIndex = LeftRootIndex + 1;  //因为是层序遍历,输出序列中右子树根节点紧挨着左子树根节点
    46     Func(inSeq, LevTrSeq, LeftIndex, LeftIndex + LeftNum - 1, LeftRootIndex);
    47     Func(inSeq, LevTrSeq, LeftIndex + LeftNum + 1, RightIndex, RightRootIndex);
    48     return;
    49 }
    50 
    51 int GetLeftNum(int num)
    52 {
    53     int h = 0;  //tree height
    54     int i, LowestNum;  //LowestNum is the nodes number of the lowest level
    55     int LeftNum;
    56     int LastLevelNum = 1;  //each level nodes number
    57     int Num = num;  //底下还要用到num,不能直接对其进行操作
    58     while(Num > 1){
    59         Num /= 2;
    60         h++;
    61     }
    62     for(i = 0; i < h - 1; i++){
    63         LastLevelNum *= 2;
    64     }
    65     //这里的操作务必是上一层全部节点数乘2,不能先乘到最后一层再用除以2操作。
    66     //容易除成负数最后负数返回导致数组下标为负出错
    67     LowestNum = num - LastLevelNum * 2 + 1;
    68     LeftNum = Min(LastLevelNum, LowestNum) + LastLevelNum - 1;
    69     return LeftNum;
    70 }
    71 
    72 int Min(int a, int b)
    73 {
    74     return (a < b) ? a : b;
    75 }
  • 相关阅读:
    jQuery 在 IE 上 clone checkbox 的問題。
    C/C++ typedef用法
    C++继承
    map常用操作
    C++ JsonCpp 使用(含源码下载)
    string常用操作
    C++虚函数
    STL容器迭代过程中删除元素技巧(转)
    关于IE下用HTTPS无法下载/打开文件(转)
    C++STL概览
  • 原文地址:https://www.cnblogs.com/biankun/p/8695653.html
Copyright © 2011-2022 走看看