运用栈非递归遍历二叉树

1.先序遍历一颗二叉树
方法一:

void preTree1(TreeNode* root)
{
    if(!root)
        return ;
    stack<TreeNode*>treestack;
    cout<<root->data<<' ';
    treestack.push(root);

    while(treestack.size())
    {
        TreeNode* node=treestack.top();
        if(node->left)
        {
            cout<<node->left->data<<' ';
            treestack.push(node->left);
            node->left=NULL;
        }
        else
        {

            treestack.pop();
            if(node->right)
            {
                cout<<node->right->data<<' ';
                treestack.push(node->right);
            }
        }
    }
}

方法二:

void preTree2(TreeNode* root)
{
    if(!root)
        return;
    stack<TreeNode*>treestack;
    treestack.push(root);
    while(treestack.empty()==false)
    {
        TreeNode* node=treestack.top();
        cout<<node->data<<' ';
        treestack.pop();
        if(node->right)
            treestack.push(node->right);
        if(node->left)
            treestack.push(node->left);
    }
}

2.中序遍历二叉树

方法一:


void inTree1(TreeNode* root)
{
    if(!root)
        return;
    stack<TreeNode*>treestack;
    treestack.push(root);
    while(treestack.size())
    {
        TreeNode* node=treestack.top();
        if(node->left)
        {
            treestack.push(node->left);
            node->left=NULL;
        }
        else
        {
            treestack.pop();
            cout<<node->data<<' ';
            if(node->right)
            {
                treestack.push(node->right);            
            }
        }
    }
}

方法二:


TreeNode*  inTree2(TreeNode* node)
{
    TreeNode* root=node;
    if(!root)
        return NULL;
    stack<TreeNode*>treestack;

    while(treestack.size()||root)
    {
        while(root)
        {
            treestack.push(root);
            root=root->left;
        }   
        if(treestack.size())
        {
            root=treestack.top();
            treestack.pop();
            cout<<root->data<<' ';
            root=root->right;
        }
    }
    return node;
}

3.后序遍历二叉树

void lastTree(TreeNode* root)
{
    if(!root)
        return;
    stack<TreeNode*>treestack;
    treestack.push(root);
    while(treestack.size())
    {
        TreeNode* node=treestack.top();
        if(node->left)
        {
            treestack.push(node->left);
            node->left=NULL;
        }
        else if(node->right)
        {
                treestack.push(node->right);
                node->right=NULL;
        }
        else
        {
            cout<<node->data<<' ';
            treestack.pop();
        }
    }
}

4.层序遍历二叉树


void lay(TreeNode* root)
{
    if(!root)
        return;
    deque<TreeNode*>treedeque;
    treedeque.push_back(root);
    while(treedeque.size())
    {
        TreeNode* node=treedeque.front();
        treedeque.pop_front();
        cout<<node->data<<' ';
        if(node->left)
            treedeque.push_back(node->left);
        if(node->right)
            treedeque.push_back(node->right);

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值