c++遍历中的树排序
Tree Sort in C++ traversal
我正在研究一个问题,我们给出一个数组,是使用基于链表的树排序,然后遍历树来改革(现在排序)数组,而不使用向量。下面是我的代码:
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;
在树中没有作用。
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
所有的动态内存,一旦我们完成了树。如果你明白我的遍历是如何工作的,你应该可以自己做。
相关文章:
- 有什么方法可以遍历结构吗
- 在循环中按顺序遍历成员变量
- 遍历模板参数
- 在遍历处理程序的向量时注册和注销处理程序
- C++RapidXml-使用first_node()遍历以修改XML文件中节点的值
- 遍历并行数组以确定C++中的最大数字
- 遍历顺序由 std::文件系统directory_iterator给出
- 遍历链表时的无限循环
- 遍历unordered_map向量
- 从预序遍历构造 bst 的 c++ 和 python 解决方案之间的区别
- C++声明双链表,使用两个 for 循环双向遍历列表并打印
- 如何正确地推回然后遍历堆中对象的向量?
- 遍历二维数组的所有子数组
- 如何在可变参数模板函数中遍历可变参数元组?
- 避免在遍历 IShellItemArray 时出现代码重复
- 从特定键开始遍历地图
- 关于链表遍历和调试的困惑
- 将树节点添加到向量向量中的 n 元树遍历的平均和最坏情况时间复杂度是多少?
- 为什么即使使用 for 循环遍历我的向量,它也没有输出到控制台?(C++)
- c++遍历中的树排序