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;}

原创粉丝点击