用栈非递归实现二叉树的遍历

参考链接:https://www.jianshu.com/p/12848eef3452

栈实现树的前序遍历

void preTraversal(TreeNode* root){
    if(root==NULL)
        return ;
    stack<TreeNode*> s;
    TreeNode *current;
    s.push(root);
    while(s.empty()==false){
        current = s.top();
        s.pop();
        cout<<current->val<<endl; // 或者其他对节点的访问操作
        if(current->right!=NULL)
            s.push(current->right);
        if(current->left!=NULL)
            s.push(current->left);
        // 先压右节点再左节点是利用栈的后进先出特性,这样达到先访问左节点再访问右节点的功能
    }
}

栈实现树的中序遍历

void inorderTraversal(TreeNode* root){
    if(root == NULL)
        return ;
    stack<TreeNode*> s;
    TreeNode *current;
    s.push(root);
    while(s.empty() == false){
        while(s.top()->left!=NULL)
            s.push(s.top()->left); // 一直遍历到最左节点
        while(s.empty() == false){
            current = s.top(); // 第一个为最左边的节点
            cout<<current->val<<endl; // 输出操作也可以是其他对节点的访问操作
            if(current->right!=NULL){
                s.push(current->right); 
                break;         // 需要跳出循环,右边的仍需要一直遍历到最左边
            }
        }
    }
}

栈实现树的后序遍历

void postTraversal(TreeNode* root){
    if(root == NULL)
        return ;
    stack<TreeNode*> s;
    TreeNode *lastNode = NULL; // 保存上一个节点信息
    s.push(root);
    while(s.empty() == false){
        while(s.top()->left!=NULL) // 同中序遍历,一直遍历到最左边节点
            s.push(s.top()->left);
        while(s.empty() == false){
            if(s.top()->right == lastNode||s.top()->right == NULL){ // 如果右节点已经访问过或者无右节点才能够访问根节点
                cout<<s.top()->val<<endl; // 对该节点进行访问
                lastNode = s.top();
                s.pop();
            }
            else if(s.top()->right!=NULL){
                s.push(s.top()->right);
                break;
            }
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值