【发布时间】:2020-04-27 03:58:45
【问题描述】:
大家好,所以我得到了这个任务来制作一个可以进行遍历的非二叉树的广告。我从一开始就搞砸了结构,但我仍然可以进行后序和前序遍历(我不知道我是否也做错了,但它有效)。现在我很困惑如何进行中序遍历。我的代码不起作用。
-
这是我的数据结构
typedef char infotype; typedef int letak; typedef struct { infotype info; letak parent, firstson, nextsibling; } node; typedef node tree; -
这些是我初始化每个节点的方式
void initNode(tree T[], int k, int i) { char info; printf("Input the node name : "); scanf(" %c", &info); createNode(T, k, i, info); } void createNode(tree T[], int k, int i, char value) { int j; if(i == 0) { T[i].info = value; T[i].firstson = i+1; } else { T[i].info = value; T[i].parent = (i-1) / k; T[i].firstson = (i * k) + 1; if (i % k != 0) { T[i].nextsibling = i+1; } else { T[i].nextsibling = 0; } } } -
这就是我尝试按顺序遍历的方式
void InOrder(tree T[], int maksimum_array, int maksimum_anak) { bool Resmi = true; int i = 0; while(i >= 0) { if(T[i].firstson < maksimum_array - 1 && Resmi == true) { i = T[i].firstson; } else { if(Resmi == true) { printf("%c ", T[i].info); } if(i = T[T[i].parent].firstson) { printf("%c ", T[T[i].parent].info); } if(T[i].nextsibling < maksimum_array - 1 && T[i].nextsibling != 0) { i = T[i].nextsibling; Resmi = true; } else { i = T[i].parent; Resmi = false; } } } } -
这是我的主要驱动力:
int main() { tree pohon[1000]; int maksimum; int maksimum_anak; int level; int i = 0; int count = 0; char cari; printf("Enter array maximum amount : "); scanf("%d", &maksimum); printf("\nEnter maximum child of each node : "); scanf("%d", &maksimum_anak); createTree(pohon); for (i = 0; i < maksimum ; i++) { initNode(pohon, maksimum_anak, i); } for (i = 0; i < maksimum; i++) { printTree(pohon, i, maksimum, maksimum_anak); } printf("In Order Traversal : "); InOrder(pohon, maksimum, maksimum_anak); }
我尝试了另一种用于按顺序遍历的算法,例如使用递归。但是由于我弄乱了结构,这些算法就不起作用了。之前谢谢你。
【问题讨论】:
-
您必须首先定义三叉树或更高叉树的按序遍历是什么意思,然后才能支持它。是否会在 每个 对连续的子代之间遍历父代?如果不是,那么它在哪一对之间遍历?有多种选择。
-
我想我的意思是在我得到第一个儿子后立即遍历父母
-
看起来节点
i的父节点始终是节点(i-1)/k,它的j'th子节点(其中0 <= j < k)始终是(i * k) + j + 1。为什么需要node的parent和firstSon字段?您的树完全由infotype数组和该数组中的元素数定义。