程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程綜合問答 >> c++ c 樹-不用棧的非遞歸二叉樹遍歷 求改正 (C++新手)

c++ c 樹-不用棧的非遞歸二叉樹遍歷 求改正 (C++新手)

編輯:編程綜合問答
不用棧的非遞歸二叉樹遍歷 求改正 (C++新手)

原程序如下,添加了雙親域parent和標志域mark;不知道哪裡不對:

#include"iostream"
using namespace std;
class BinTree;

class BinNode
{
private:
int data;

BinNode *lchild;
BinNode *rchild;
BinNode *parent;
int mark;
friend class BinTree;

};

class BinTree
{
private:
BinNode *root;

public:
BinTree()
{
root=0;
}

BinNode *Get_Root()
{
    return root;
}

BinNode *Create_Tree(BinNode *r)    //先序建立二叉樹
{
    int d;
    cout<<"輸入數據(0代表空):";
    cin>>d;
    if(d==0)
        return NULL;
    else
    {
        r=new BinNode;
        r->data=d;
        r->lchild=Create_Tree(r->lchild);
        r->rchild=Create_Tree(r->rchild);
    }
    root=r;
    return r;
}

void InOrder_rec1(BinNode *p)   //xian序遍歷
{

    if(p)
    {
        cout<<p->data<<"  ";
        InOrder_rec1(p->lchild);
        InOrder_rec1(p->rchild);
    }
}
void InOrder_rec2(BinNode *p)   //中序遍歷
{

    if(p)
    {
        InOrder_rec2(p->lchild);
        cout<<p->data<<"  ";
        InOrder_rec2(p->rchild);
    }
}


void PostOrder_rec(BinNode *p)//後續遍歷
{
    BinNode*t=p;
    t->mark=0;
    while (t)
    {
        switch(t->mark){
        case 0:

            t->mark=1;
            if(t->lchild) t=t->lchild;
            break;
        case 1:
            t->mark=2;
            if(t->rchild) t=t->rchild;

        case 2:
            cout<<t->data<<endl;
            t->mark=0;
            t=t->parent;
            break;
                default:; 

        }
    }

}

};

int main()
{
BinTree tree;
BinNode *p=NULL;
p=tree.Create_Tree(p);

cout<<"先序遍歷二叉樹:";
tree.InOrder_rec1(p);
cout<<endl;

cout<<"中序遍歷二叉樹:";
tree.InOrder_rec2(p);
cout<<endl;

cout<<"中序遍歷二叉樹:";
tree.PostOrder_rec(p);
cout<<endl;

}

最佳回答:


#include"iostream"
using namespace std;
class BinTree;

class BinNode
{
private:
    int data;

    BinNode *lchild;
    BinNode *rchild;
    BinNode *parent;
    int mark;
    friend class BinTree;
};

class BinTree
{
private:
    BinNode *root;

public:
    BinTree()
    {
        root=0;
    }

    BinNode *Get_Root()
    {
        return root;
    }

    BinNode *Create_Tree(BinNode *r)    //先序建立二叉樹
    {
        int d;
        cin>>d;
        if(d==0)
            return NULL;
        else
        {
            r=new BinNode;
            r->data=d;
            r->lchild=Create_Tree(r->lchild);
            r->rchild=Create_Tree(r->rchild);
        }
        root=r;
        return r;
    }

    void InOrder_rec1(BinNode *p)   //xian序遍歷
    {

        if(p)
        {
            cout<<p->data<<"  ";
            InOrder_rec1(p->lchild);
            InOrder_rec1(p->rchild);
        }
    }
    void InOrder_rec2(BinNode *p)   //中序遍歷
    {

        if(p)
        {
            InOrder_rec2(p->lchild);
            cout<<p->data<<"  ";
            InOrder_rec2(p->rchild);
        }
    }


    void PostOrder_rec(BinNode *p)//後序遍歷
    {

        if(p)
        {
            InOrder_rec2(p->lchild);
            InOrder_rec2(p->rchild);
            cout<<p->data<<"  ";
        }
    }
};

int main()
{
    BinTree tree;
    BinNode *p=NULL;
    cout<<"輸入數據(0代表空):";
    p=tree.Create_Tree(p);

    cout<<"先序遍歷二叉樹:";
    tree.InOrder_rec1(p);
    cout<<endl;

    cout<<"中序遍歷二叉樹:";
    tree.InOrder_rec2(p);
    cout<<endl;

    cout<<"後序遍歷二叉樹:";
    tree.PostOrder_rec(p);
    cout<<endl;
}
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved