tt
来源:互联网 发布:mac改变用户名 编辑:程序博客网 时间:2024/04/30 17:03
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;}