树的前序、中序、后序遍历

#include <iostream>
#include <stdlib.h>
using namespace std;

#define MAXSIZE 100
#define OK 0
#define ERROR -1
//定义结构体模板 
template <typename Type> 
 struct Node{
  struct Node<Type>* left;
  Type val;
  struct Node<Type>* right;

} ;
 typedef struct Node<int> Bnode, *Bitree;

class Stack{
private:
    int top;
    public:
    Bnode* node_array[MAXSIZE];
 public:
    Stack(){
        InitStack();
    }
    void InitStack(){
        top = -1;
    }
    bool isEmpty();
    void push(Bnode* node);
    int pop();
    int getTop(){
        return top;
    } 

};
 bool Stack::isEmpty(){
    if (top < 0){
        return true;
    }

    else return false;
 }

 void Stack::push(Bnode* node){
    top++;
    if (top > MAXSIZE){
       cout<<"Size of  Stack is Over MAXSIZE"<<endl;
       return ;
      }
    node_array[top] = node;
    return;
 }

 int Stack::pop(){
   if(isEmpty())
   {
    cout<<"Stack is NULL!!!"<<endl;
    return -1;
   }

   return top--;    
 }

Bitree CreateBitree(){

    int val;
    Bitree T;

    cin>>val;

    if (val == 0)  
        T = NULL;
    else {
        T = (Bitree) malloc(sizeof(Bnode));
        T->val = val;
        cout<<"Create left:";
        T->left = CreateBitree();
        cout<<"Create right:";
        T->right = CreateBitree();
    }
    return T;
} 

//前序遍历二叉树 
int preOrderTraverse(Bitree node){
    Stack s;
    s.push(node);
    while(!s.isEmpty()){
        while(node){
            cout<<node->val<<" ";
            node = node->left;
            if(node)
                s.push(node);
        }
        if(!s.isEmpty()){
            node = s.node_array[s.pop()];
            if(node = node->right){
                s.push(node);
            }   
        }
    }
    return OK;
} 

//中序遍历二叉树 
int InOrderTraverse(Bitree node){
    Stack s;
     s.push(node);
    while(!s.isEmpty()){
        //遍历左子树 
        while(node){
            node = node->left;
            if(node)
             s.push(node);
         }
       if(!s.isEmpty())   {
            node = s.node_array[s.getTop()];
            cout<<node->val<<" ";
            s.pop();
            node = node->right;
            if(node){
                s.push(node);
            }
        }
    }
   return OK;   
}
//后序遍历二叉树 
int postOrderTraverse(Bitree node){
    Stack s;
    int flag[MAXSIZE];
    for(int i = 0; i < MAXSIZE; i++)
        flag[i] = 0;

    s.push(node);
    flag[s.getTop()] = 1;
    while(!s.isEmpty()){
        while(node){
            node = node->left;
            s.push(node);
            flag[s.getTop()] ++;
        }
           node = s.node_array[s.getTop()];
           if(node->right){
               node = node->right;
           }
              flag[s.getTop()]++;
    }
} 

int main(){
    Stack s;

    Bitree Tree = CreateBitree();
    cout<<"InOrderTraverse():";
    InOrderTraverse(Tree);
    /*while(!s.isEmpty()){
        temp = s.node_array[s.pop()];
        cout<<temp->val<<" ";
    }*/
    cout<<endl<<"preOrderTraverse():";
    preOrderTraverse(Tree);

    cout<<endl<<"postOrderTraverse():";
    postOrderTraverse(Tree); 
   // cout<<endl<<"Traverse Success!!";

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值