C++ C+中的树排序+;横穿

C++ C+中的树排序+;横穿,c++,algorithm,sorting,C++,Algorithm,Sorting,我正在研究一个问题,我们得到一个数组,使用一个基于链表的树排序对它进行排序,然后遍历树来重新构造(现在排序的)数组,而不使用向量。这是我的密码: 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 i

我正在研究一个问题,我们得到一个数组,使用一个基于链表的树排序对它进行排序,然后遍历树来重新构造(现在排序的)数组,而不使用向量。这是我的密码:

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);
    }
}
使用名称空间std;
#包括
//将b[0..n-1]按非降序(即升序)排序。
结构tNode{int val;tNode*leftC;tNode*rightC;};
无效插入(tNode*&此处,int val){
//基本情况
if(此处==NULL){
这里=新的tNode();
这里->val=val;
here->leftC=here->rightC=NULL;
返回;
}
否则如果(val){
插入(此处->左C,val);
}
否则{
插入(此处->右侧C,val);
}
}
整数遍历(tNode*节点){
if(node==NULL)返回-1;
如果(!node->leftC==NULL)遍历(node->leftC);
int r=节点->值;
如果(!node->rightC==NULL)遍历(node->rightC);
否则{
node=NULL;
返回r;
}
}
void sortWithTree(int b[],int n){
tNode*root=NULL;
tNode*p=根;
对于(int i=0;i

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

你的问题在于遍历

我猜您的目的是调用traverse返回树中包含的最小数字,并从树中删除该值。
因此,连续调用将按递增顺序返回成员。
但这很难在结构中实现,因为节点包含中间值。返回值后,您需要删除它,但不删除正确的节点。
另一个问题是参数节点不是通过引用传递的(精确地说是通过引用指针),因此指令
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);
}
void遍历(tNode*node,int*&p){
if(node==NULL)返回;
导线测量(节点->左C,p);
*p=节点->值;
++p;
导线测量(节点->右侧C,p);
}
void sortWithTree(int b[],int n){
tNode*root=NULL;
tNode*p=根;
对于(int i=0;i

你的代码和我的代码还有一些事情要做。一旦我们处理完树,删除所有动态内存。如果您了解我的遍历是如何工作的,您应该能够自己执行。

该函数返回-1,因为要么节点为空,
r
-1
,要么该函数未能返回值(您在末尾执行),而偶然返回的值为
-1
。选择(调试代码)。