Exercices sur la structure des données: déterminez s'il s'agit du suffixe d'un arbre de recherche binaire

sujet:

【问题描述】输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。如果是返回true,否则返回false。
【输入形式】输入任意长度的数组,数字之间空格分开
【输出形式】true 或者 false
【样例输入】输入  5 7 6 9 11 10 8
【样例输出】true
【样例说明】由于这一整数序列是如下树的后序遍历结果:

         8
       /  \
      6    10
    / \    / \
   5   7   9  11

因此返回true。

【评分标准】暴力求解法不得分。

Idées:

  1. Quand j'ai posé cette question, je ne me suis pas retourné. Je pensais que la structure en ordre peut être obtenue en fonction du tri. Avec le suivi et l'ordre, un arbre peut être construit, puis je peux juger si l'arbre est un arbre de tri binaire. Mais cette idée est fausse
  2. L'idée correcte est en fait très simple:
    vérifiez l'expression du suffixe, le dernier est la racine, recherchez dans l'arbre et parcourez le tableau dans l'ordre, de la tête du tableau au premier nœud plus grand que la racine est l'enfant gauche, et le bon enfant doit tous être supérieur à la racine, récursif, Si le bon enfant n'est pas supérieur à la racine, le parcours du suffixe est faux
  3. pre(int las[], int start, int index)Cette fonction est une fonction récursive, start-index est la plage de suffixes à parcourir à ce moment, index est la racine de cette plage, par exemple, au 5 7 6 9 11 10 8début start = 0, index = 6, où las [index] est la racine de cette plage
  4. find_min(int las[], int start, int index)Cette fonction consiste à trouver le premier nœud supérieur ou égal à la racine, puis à utiliser ce point pour diviser la portée - en divisant essentiellement les nœuds enfants gauche et droit de la racine
  5. Récursivité vers les sous-plages gauche et droite à la fin

Code:

#include <stdio.h>
#include <stdlib.h>

int find_min(int las[], int start, int index) {
    
    
    for (int i = start; i < index; i++) {
    
    
        if (las[i] >= las[index]) {
    
    
            return i;
        }
    }
}

int pre(int las[], int start, int index) {
    
      // index为后缀遍历时对应的根的
    // printf("start = %d   index = %d\n", start, index);
    if (start < index) {
    
    
        // printf("index = %d\n", index);
        int end = find_min(las, start, index);  // 刚比las[index]大或者等的下标
        // printf("end = %d\n", end);
        for (int i = end; i < index; i++) {
    
    
            if (las[i] < las[index]) {
    
    
                return 0;
            }
        }
        pre(las, start, end - 1);
        // printf("sss end = %d\n", end);
        pre(las, end, index - 1);
    }
    return 1;
}


int main() {
    
    
    int las[40];
    int l_num = 0;  // 字符的个数
    do {
    
    
        scanf("%d", &las[l_num++]);
    } while (getchar() != '\n');
    // printf("%d\n", l_num);
    if (pre(las, 0, l_num - 1)) {
    
    
        printf("true");
    }
    else
        printf("false");
    return 0;
}

Je suppose que tu aimes

Origine blog.csdn.net/qq_43779658/article/details/106604339
conseillé
Classement