int WalkBintreeByStack(Bintree *t, DoFunc df)
{
struct StkElement *cur;
int level;
int left;
struct StkElement *root;
// 创建包含40个元素的栈
Stack *stack = NULL;
stack = CreateStack(40);
if (!stack)
{
fprintf(stderr, "%s\n", "Error creating stack!");
return TREE_FAIL;
}
if (!(t->DummyHead->link[RIGHT]))
{
// 空树
fprintf(stderr, "%s\n", "Empty tree!");
return TREE_FAIL;
}
// 初始化cur节点
cur = (struct StkElement *)malloc(sizeof(struct StkElement));
if (!cur)
{
fprintf(stderr, "%s\n", "Error creating temporary data area!");
return TREE_FAIL;
}
root = (struct StkElement *)t->DummyHead->link[RIGHT];
if (!memcpy(cur, root, sizeof(struct StkElement))) // 拷贝根节点到当前栈元素
{
fprintf(stderr, "%s\n", "Error copying data area!");
return TREE_FAIL;
}
level = 0; // 记录层数
left = 0; // 记录进入左子节点次数
while (stack->top != -1 || cur)
{
while (cur) // 左子树
{
PushElement(stack, cur);
cur = cur->link[LEFT];
level++;
left++;
}
cur = (struct StkElement *)malloc(sizeof(struct StkElement));
if (!cur)
{
fprintf(stderr, "%s\n", "Error creating temporary data area!");
return TREE_FAIL; // 创建栈元素失败
}
PopElement(stack, cur);
df(cur, --level); // 遍历当前节点
cur = cur->link[RIGHT]; //进入右子树
left--;
if (!left)
level++;
}
return TREE_OK;
}
tt
最新推荐文章于 2021-04-16 09:16:08 发布