二叉树的三种非递归遍历整理

前序遍历

void preOrder(TreeNode* p){
    if(!p)return;
    TreeNode* t;
    t = p;
    stack<TreeNode*> nodes;
    nodes.push(t);
    while(!nodes.empty()){
        t = nodes.top();
        nodes.pop();
        Visit(t);
        if(t->right)
            nodes.push(t->right);
        if(t->left)
            nodes.push(t->left);
    }
    cout<<endl;
}

//数组实现的栈结构
void preorderNonrecursion(TreeNode *bt){
    if(bt!=NULL){
        TreeNode *Stack[MAXLEN];
        int top = -1;
        TreeNode *p;
        Stack[++top] = bt;
        while(top!=-1){
            p = Stack[top--];
            Visit(p);
            if(p->right!=NULL)
                Stack[++top] = p->right;
            if(p->left!=NULL)
                Stack[++top] = p->left;
        }
    }
}

中序遍历

思路:

根结点入栈。

循环:栈顶结点遍历到最左结点,每个结点都入栈。然后访问栈顶结点并出栈,该结点右结点入栈(没有就设为NULL)

void inOrder(TreeNode* p){
    if(!p)return;
    TreeNode* t;
    t = p;
    stack<TreeNode*> nodes;
    nodes.push(t);
    while(!nodes.empty()){
        while(t&&t->left){
            t = t->left;
            nodes.push(t);
        }
        t = nodes.top();
        Visit(t);
        nodes.pop();
        if(t->right){
            t = t->right;
            nodes.push(t);
        }else
            t= NULL;
    }
    cout<<endl;
}

//数组实现栈结构
void inorderNonrecursion(TreeNode *bt){
    if(bt!=NULL){
        TreeNode *Stack[MAXLEN];
        int top = -1;
        TreeNode *p;
        p = bt;
        while(top!=-1||p!=NULL){
            //深度遍历,直到没有左结点
            while(p!=NULL){
                Stack[++top] = p;
                p = p->left;
            }
            if(top!=-1){
                p = Stack[top--];
                Visit(p);
                p = p->right;
            }
        }
    }
}

后序遍历

解析:

简单方法----后序遍历其实是对原树的镜像树先序遍历的数组倒序的结果。

可以将原树的镜像树先序遍历的数组存入栈中,最后倒着全部输出即可。

void postorderNonrecursion(TreeNode *bt){
    if(bt!=NULL){
        TreeNode *Stack1[MAXLEN];
        TreeNode *Stack2[MAXLEN];
        int top1 = -1;
        int top2 = -1;
        TreeNode *p;
        Stack1[++top1] = bt;
        while(top1!=-1){
            p = Stack1[top1--];
            Stack2[++top2] = p;
            if(p->left!=NULL)
                Stack1[++top1] = p->left;
            if(p->right!=NULL)
                Stack1[++top1] = p->right;
        }
        while(top2!=-1){
            p = Stack2[top2--];
            Visit(p);
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值