樹代碼

#include
#include <stack>
using namespace std;


//定義樹的節點類型
typedef  struct Node
{
int data;
struct Node *  lchild;
struct Node *  rchild;
} tree;




//定義棧存儲節點類型
typedef struct SNode
{
tree * node;
bool   isFirst;
}SNode;


//創建樹
void  CreateTree(tree * &node)
{
int data;
cin>>data;
if(data==-1)
{
node=NULL;
}
else
{
       node=new tree;
  node->data=data;
  node->lchild=NULL;
  node->rchild=NULL;
       
       CreateTree(node->lchild);
  CreateTree(node->rchild);
}
}
//遞歸實現樹的前序遍歷
void  PreViewTree(tree *node)
{
if(node!=NULL)
{
cout<<node->data<<"\t";
        PreViewTree(node->lchild);
        PreViewTree(node->rchild);
}
}


//遞歸實現樹的中序遍歷
void  MidViewTree(tree *node)
{
if(node!=NULL)
{
       MidViewTree(node->lchild);
  cout<<node->data<<"\t";
       MidViewTree(node->rchild);
}
}


//遞歸實現數的後序遍歷
void  LasViewTree(tree *node)
{
if(node!=NULL)
{
       LasViewTree(node->lchild);
  LasViewTree(node->rchild);
  cout<<node->data<<"\t";
}
}


//實現非遞歸樹的前序遍歷
void  PreViewStackTree(tree* node)
{
 stack<tree*> s1;//push pop top empty
      while(node!=NULL || !s1.empty())
 {
 while(node!=NULL)
 {
 cout<<node->data<<"\t";
 s1.push(node);
 node=node->lchild;
 }


 if(!s1.empty())
 {
 node=s1.top();
 s1.pop();
 node=node->rchild;  
 }
 }
}


//實現樹非遞歸的中序遍歷
void  MideViewStackTree(tree * node)
{
     stack<tree*> s1;//push pop top empty
while(node!=NULL ||!s1.empty())
{
 while(node!=NULL)
 {
 s1.push(node);
 node=node->lchild;
 }
 if(!s1.empty())
 {
 node=s1.top();
 s1.pop();
 cout<<node->data<<"\t";
 node=node->rchild;
 }
}
}


//實現樹的非遞歸後續遍歷
void  LastViewStackTree(tree* node)
{
stack<SNode*> s1;
SNode *stnode;
while(node!=NULL || !s1.empty())
{
while(node!=NULL)
{
            stnode=new SNode;
stnode->node=node;
stnode->isFirst=true;
s1.push(stnode);
node=node->lchild;
}
if(!s1.empty())
{
stnode=s1.top();
s1.pop();
if(stnode->isFirst)
{
stnode->isFirst=false;
s1.push(stnode);
node=stnode->node->rchild;
}
else
{
cout<<stnode->node->data<<"\t";
node=NULL;
}
}
}


}
int main(int argc, char *argv[])
{
    tree *node;
CreateTree(node);
PreViewTree(node);
cout<<endl;
MidViewTree(node);
cout<<endl;
LasViewTree(node);
cout<<endl;
PreViewStackTree(node);
cout<<endl;
LastViewStackTree(node);
cout<<endl;
return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章