用栈实现数的后序遍历

用栈实现数的后序遍历

void Postorder(BiTree T){
    Stack S; //用于记录根和字根结点
    InitStack(S);//初始化栈
    BiNode *p=T://临时变量记录记录当前访问的结点
    BiNode *r = NULL;//临时变量,记录上一个访问到的结点,因为从右边访问根结点必定是右子树已经遍历完了,此时上一个访问的结点必定是右子树的根结点
    while(p || !IsEmpty(S)){
        if(p!=NULL){
            push(S,p);
            p = p->lchild;
        }else{
            GetTop(S,p);//只读取根结点,不对栈内结点进行操作
            //没有对右子树进行操作过
            if(p->rchild != NULL && p->rchild != r){
                p = p->rchild;
                push(S,p);
                p = p->lchild;
            }else{
                pop(S,p);
                visit(p);//对p进行访问,可以进行打印等操作
                r = p;//记录当前访问的是p结点
                p == NULL;//把p置空,进入下一次循环,直到栈内无元素,且p为空时遍历完成
            }//else    
        }//else
    }//while
}

弱智icoding nmsl

#include <stdio.h>
#include "bitree.h" //请不要删除,否则检查不通过

bool path(BiTNode* root, BiTNode* node, Stack* s){
    BiTNode *r = NULL;
    if (root == NULL || node == NULL) return false;
    while(root || !is_empty(s)){
        if(root != NULL){
            push(s,root);
            if(root == node) return true;
            root = root->left;
        }else{
            top(s,&root);
            if(root->right != NULL && root->right != r){
                root = root->right;
            }else{
                pop(s,&root);
                r = root;
                root = NULL;
            }//else    
        }//else
    }//while
    return false;
}

最精简的树的后序遍历版本

#include <stdlib.h>
#include <stdio.h>
#include "bitree.h" //请不要删除,否则检查不通过

bool path(BiTNode* root, BiTNode* node, Stack* s){
    BiTNode *r = NULL;
    if (root == NULL || node == NULL) return false;
    while(root || !is_empty(s)){
        while(root != NULL){
            push(s,root);
            if(root == node) return true;
            root = root->left;
        }
            top(s,&root);
            if(root->right == NULL || root->right == r){
                pop(s,&root);
                r = root;
                root = NULL;
            }else{
               root = root->right;
            }//else    
    }//while
    return false;
}
posted @ 2024-05-21 23:09  陳51r  阅读(86)  评论(0)    收藏  举报