树三种遍历方式循环

class BTnode
{
public:
    BTnode(int a):value(a),left(NULL),right(NULL){};
    int value;
    BTnode* left;
    BTnode* right;
};


/*
*   先序遍历 循环
*/
void Preorder(BTnode* root)
{
    stack stack;
    if(root==NULL)return;
    BTnode* cur=root;
    while(cur!=NULL)
    {
        cout<value<<" ";
        if(cur->left != NULL)
        {
            stack.push(cur);
            cur=cur->left;
        }
        else if(cur->right != NULL)
        {
            cur=cur->right;
        }
        else 
        {
            cur=NULL;
            while(!stack.empty())
            {
                BTnode* tmp=stack.top();
                if(tmp->right!=NULL)
                {
                    cur=tmp->right;
                    stack.pop();
                    break;
                }
                stack.pop();
            }
        }
    }
    cout< stack;
    BTnode* cur=root;
    while(cur!=NULL)
    {
        if(cur->left!=NULL)
        {
            stack.push(cur);
            cur=cur->left;
        }
        else
        {
            cout<< cur->value<<" ";
            if(cur->right!=NULL)
            {
                cur=cur->right;
            }
            else
            {
                cur=NULL;
                BTnode* tmp=NULL;
                while(!stack.empty())
                {
                    tmp=stack.top();
                    cout<value<<" ";
                    if(tmp->right!=NULL)
                    {
                        cur=tmp->right;
                        stack.pop();
                        break;
                    }
                    stack.pop();
                }
            }
        }
    }
    cout< stack;
    int flag=0;
    while(cur!=NULL)
    {
        if(cur->left!=NULL)
        {
            stack.push(cur);
            cur=cur->left;
        }
        else if(cur->right!=NULL)
        {
            stack.push(cur);
            cur=cur->right;
        }
        else 
        {
            cout<value<<" ";
            BTnode* tmp;
            BTnode* pre=cur;
            cur=NULL;
            while(!stack.empty())
            {
                tmp=stack.top();                              //判断出栈时,当前的节点是top节点的左儿子还是右儿子,
                if(tmp->right==pre||tmp->right==NULL)         //从而判断当前top节点的左右儿子是否已经被访问.如果当前节点是左儿子,
                {                                             //则说明右儿子还未被访问,如果是右儿子则说明两个儿子都被访问了,
                    cout<value<<" ";                    //可以访问父节点了
                    pre=tmp;
                    stack.pop();
                }
                else if(tmp->left==pre)
                {
                    cur=tmp->right;
                    break;
                }    
            }
        }
    }
    cout << endl;
}

你可能感兴趣的:(树三种遍历方式循环)