c++遍历中的树排序

Tree Sort in C++ traversal

本文关键字:排序 遍历 c++      更新时间:2023-10-16

我正在研究一个问题,我们给出一个数组,是使用基于链表的树排序,然后遍历树来改革(现在排序)数组,而不使用向量。下面是我的代码:

using namespace std;
#include <iostream>
// sorts b[0..n-1] into non-descending (i.e. ascending) order.
struct tNode { int val; tNode * leftC; tNode * rightC; };
void insert(tNode * &here, int val) {
    //base case
    if (here == NULL) {
        here = new tNode();
        here->val = val;
        here->leftC = here->rightC = NULL;
        return;
    }
    else if (val <= here->val) {
        insert(here->leftC, val);
    }
    else {
        insert(here->rightC,val);
    }
}
int traverse(tNode * node) {
    if (node == NULL) return -1;
    if (!node->leftC == NULL)traverse(node->leftC);
    int r = node->val;
    if (!node->rightC == NULL)traverse(node->rightC);
    else {
        node = NULL;
        return r;
    }
}
void sortWithTree(int b[], int n) {
    tNode * root = NULL;
    tNode * p = root;
    for (int i = 0; i < n; i++) {
        insert(p, b[i]);
    }
    for (int i = 0; i < n; i++) {
        b[i] = traverse(root);
    }
}

遍历每次返回-1。我做错了什么?

你的问题在于导线。

我猜你的意图是让调用遍历返回树中包含的最小的数字,并从树中删除该值。
以便后续调用按递增顺序返回成员。
但这在您的结构中很难做到,因为节点包含中间值。一旦返回值,您需要擦除它,但不擦除正确的节点。
另一个问题是参数节点不是通过引用传递的(准确地说,是通过对指针的引用),因此指令node = NULL;在树中没有作用。

比起修复你的行程,我将采用一个更简单的策略。在一次遍历中填充数组。Traverse不会返回任何元素,而是接收一个指向数组的指针,并将元素存储在那里,指针的值会随着移动而递增。
void traverse(tNode * node, int*& p) {
    if (node == NULL) return;
    traverse(node->leftC, p);
    *p = node->val;
    ++p;
    traverse(node->rightC, p);
}
void sortWithTree(int b[], int n) {
    tNode * root = NULL;
    tNode * p = root;
    for (int i = 0; i < n; i++) {
        insert(p, b[i]);
    }
    int *bTmp = b;
    traverse(root, bTmp);
}

你的代码和我的代码都还有事情要做。到delete所有的动态内存,一旦我们完成了树。如果你明白我的遍历是如何工作的,你应该可以自己做。