二进制搜索树 - 高度的迭代检查

时间:2015-04-18 17:29:23

标签: c stack height binary-search-tree non-recursive

所以,我有一点问题。我知道如何遍历树,使用递归与否,使用堆栈或不使用堆栈。但是,我还想跟踪每个叶子的高度,如果高度(或深度)小于给定参数以打印该叶子。这是我使用堆栈的代码:

void PrintLevelIter(struct tNode* tree, int h1){
    if(h1==0){
        printf("%d ",tree->info);
        return;
    }
    struct sNode *stek = NULL;
    push(&stek,tree);

    struct tNode* current = tree;


    while(!isEmptyStack(stek)){
        pop(&stek);
        printf("%d ",current->info);
        if(current->left != NULL && current->right != NULL){
            if(Depth(current) < h1){
                push(&stek, current);
            }
            else return;
        }
    }
}

我做错了什么?是不是因为我的堆栈实现?这是代码:

struct sNode{
    struct tNode* t;
    struct sNode* next;
};

/*Funkcije za stek*/
void push(struct sNode** top, struct tNode* t){
    struct sNode* newNode = (struct sNode*)malloc(sizeof(struct sNode));
    if(newNode==NULL)
    {
        return;
    }
    newNode->t = t;
    newNode->next = (*top);
    (*top) = newNode;
}

int isEmptyStack(struct sNode* top){
    return top==NULL;
}

struct tNode* pop(struct sNode** top){
    struct tNode* res;
    struct sNode* sTop;

    if(isEmptyStack(*top))
        printf("Stack is empty!");
    else{
        sTop = *top;
        res = sTop->t;
        *top = sTop->next;
        free(top);

    }
    return res;
}

问题是,我的输出只给了我一个根值,没有别的。有谁知道我在哪里弄错了?还是错误:)?

1 个答案:

答案 0 :(得分:1)

  1. 您不会更改循环内current的值,pop(&stek)应为current = pop(&stek)
  2. return应为continue,它不是递归,返回将在遍历所有树之前退出函数
  3. 你需要推送节点子节点而不是节点本身

    while (!isEmptyStack(stek))
    {
        current = pop(&stek);
    
        if (current->left != NULL)
            push(&stek, current->left);
        if (current->right != NULL)
            push(&stek, current->right);
    
        if (Depth(current) < h1)
            printf("%d ",current->info);
    }
    
  4. 正如@chux所说,如果堆栈为空,pop应返回NULL