在数组中搜索并搜索和遍历树

时间:2015-04-10 17:57:17

标签: c++

我最后一次分配学期时苦苦挣扎。不寻找“答案”只是寻找一些见解..自从我上一次实际的编程课以来已经很长时间了,因为这是一个数据结构类,我们不会审查代码。赋值:

用于在数组中搜索以及搜索和遍历树的程序。

  
      
  1. 要求用户输入输入数据文件的名称
  2.   
  3. 以未排序的顺序将150个随机排序值从文件加载到数组中。打印出阵列以确保维持随机顺序。
  4.   
  5. 将相同的150个随机排序数加载到二叉搜索树中。以前缀,中缀和后缀顺序打印树的遍历,以确保正确创建二叉树。
  6.   
  7. 将相同的150个随机数序列号加载到数组中。使用您要编写的任何排序例程来按升序排序数字。打印出阵列以确保数字按升序排列。
  8.   
  9. 使用计数循环要求用户输入10个数字 - 用户将输入列表中的5个数字和5个不在列表中的数字。

         
        
    • 一个。搜索每个数据结构并计算查找值所需的比较次数,或确定该数字不在列表中。

    •   
    • 我。未排序的数组 - 使用线性搜索

    •   
    • II。二进制搜索树 - 二进制搜索
    •   
    • III。排序数组 - 二进制搜索
    •   
  10.         

    湾以每种搜索的表格格式打印结果

         
        
    • 我。值
    •   
    • II。 “找到”/“找不到”
    •   
    • III。线性搜索比较次数
    •   
    • IV。比较二进制搜索树的数量
    •   
    • 诉比较二进制搜索数组
    •   
         

    ℃。打印摘要

         
        
    • 我。比较线性搜索总数
    •   
    • II。二进制搜索树的比较总数
    •   
    • III。二进制搜索数组的比较总数
    •   
到目前为止,

代码,我知道我已经离开了:

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <fstream>
#include <string>

struct bintreenode {
    int value;
    struct bintreenode* l;
    struct bintreenode* r;
} *root = NULL, *temp = NULL;

typedef struct bintreenode N;

void insert();
N* bt(int arr[], int, int);
N* new(int);

void infix(N* t);
void prefix(N* t);
void postfix(N* t);

void main() {
    ifstream inputData;
    ofstream outputData;
    string fileName;
    cout << "Enter the name of the input data file: " << endl;
    //asks user to input filename
    cin >> fileName; //inputs user input into fileName
    return 1;
    ifstream file("file.txt");
    if (file.is_open()) {
        string myArray[150];
        for (int i = 0; i < 150; ++i) {
            file >> myArray[i];
        }
    }
    int ch, i, n;
    int arr[] = {
        1, 2, 3, 4, 136, 137, 138, 139, 56, 78, 9, 10,
        16, 17, 18, 58, 59, 60, 61, 19, 20, 21, 22, 23,
        24, 118, 119, 120, 121, 25, 26, 27, 28, 29, 128,
        129, 130, 131, 33, 34, 35, 36, 37, 38, 39, 40, 41,
        42, 43, 44, 45, 46, 145, 146, 147, 148, 11, 12, 13,
        14, 15, 47, 48, 49, 55, 56, 57, 62, 63, 64, 30, 31,
        32, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 142, 143,
        144, 75, 76, 77, 78, 79, 50, 51, 52, 53, 80, 81, 82,
        83, 85, 91, 92, 96, 93, 94, 95, 97, 98, 99, 100, 101,
        102, 103, 104, 105, 54, 106, 107, 108, 109, 110, 111,
        112, 113, 114, 115, 116, 117, 122, 123, 124, 125, 126,
        127, 132, 133, 84, 86, 87 88, 89, 90, 134, 135, 140, 141,
        149, 150
    };

    n = sizeof(arr) / sizeof(arr[0]);
    printf("\n1- infix\n");
    printf("2 - postfix\n");
    printf("\nEnter 10 numbers in the list and 10 numbers not in the list : ");
    scanf("%d", &ch);
    switch (ch) {
    case 1:
        root = bt(arr, 0, n - 1);
        printf("Given infix traversal as input\n");
        for (i = 0; i <= 6; i++)
            printf("%d->", arr[i]);
        printf("\nprefix traversal of tree\n");
        prefix(root);
        printf("\ninfix traversal of tree\n");
        infix(root);
        printf("\npostfix traversal of tree\n");
        postfix(root);
        break;
    case 2:
        insert();
        printf("\nprefix traversal of tree\n");
        prefix(root);
        printf("\nInfix traversal of tree\n");
        infix(root);
        printf("\npostfix traversal of tree\n");
        postfix(root);
        break;
    default:
        printf("enter correct choice");
    }

    /* To create a binary search tree */
    N* bt(int arr[], int first, int last) {
        int mid;
        N* root = (N*)malloc(sizeof(N));
        if (first > last)
            return NULL;
        mid = (first + last) / 2;
        root = new(arr[mid]);
        root->l = bt(arr, first, mid - 1);
        root->r = bt(arr, mid + 1, last);
        return root;
    }
    /* to print infix of tree */
    void infix(N* t) {
        if (t->l != NULL)
            infix(t->l);
        printf("%d->", t->value);
        if (t->r != NULL)
            infix(t->r);
    }
    /* to print prefix traversal of tree */
    void prefix(N* t) {
        printf("%d->", t->value);
        if (t->l != NULL)
            infix(t->l);
        if (t->r != NULL)
            infix(t->r);
    }
    /* to print postfix traversal of tree */
    void postfix(N* t) {
        if (t->l != NULL)
            infix(t->l);
        if (t->r != NULL)
            infix(t->r);
        printf("%d->", t->value);
    }
    bool tree::search(int num) {
        node* temp = head;
        while (temp != NULL) {
            if (temp->data == num)
                break;
            if (num > temp->data)
                temp = temp->right;
            else
            if (num < temp->data)
                temp = temp->left;
        }
        if (temp == NULL)
            printf("Not Found");
        if (temp->data == num)
            printf("Found");
        return false;
    }
}

1 个答案:

答案 0 :(得分:1)

以下是我发现的一些问题:

不要越过溪流

    #include <stdio.h>  
    #include <iostream>
    #include <fstream>

使用C或C ++流;更喜欢C ++流。如果您需要stdio.h我们<cstdio>的定义 请勿使用coutprintf。决定;非此即彼。

编码样式:标识符中的单词区分

使用允许读者分隔标识符中隐藏名称的编码样式。 差:

struct bintreenode

更好:

struct bin_tree_node
struct binTreeNode
struct BinTreeNode

编码样式:名称不是单个字母 首选单个字母标识符的名称:
差:

struct bintreenode *l;
struct bintreenode *r;

更好:

struct bintreenode *left_subtree;
struct bintreenode *right_subtree;

使用更具描述性的标识符对您的可执行文件没有影响,对构建过程的影响可以忽略不计。它对阅读代码的人有很大的积极影响,包括你。

使用用户

中的数据

您提示用户输入文件名,但您需要硬编码:

cout << "Enter the name of the input data file: " << endl;
//asks user to input filename
cin >> fileName; //inputs user input into fileName
return 1;

ifstream file("file.txt");

此外,上面的return 1将导致执行在此时停止。不再执行,因此永远不会打开文件。

不要在结构后命名变量。 差:

int arr[] = {1, /*...*/, 150};
n = sizeof(arr) / sizeof(arr[0]);

更好:

static const int test_values[] = {1, /* ... */, 150};
static const unsigned int quantity_test_values =
    sizeof(test_values) / sizeof(test_values[0]);

如果不修改结构的内容,则更喜欢使用const前缀 如果变量不是全局变量,则更喜欢将static添加到声明中。

使用换行符终止输出

您的文字可能无法完全打印,因为某些文字可能位于缓冲区中。通常打印换行符(&#39; \ n&#39;)或std::endl将刷新缓冲区并打印剩余的文本。

使用调试器

在发布之前使用&#34;为什么它不起作用&#34;问题,使用调试器并单步执行每个语句。检查变量的正确值 添加打印语句(a.k.a。cout)以打印输出值。