二叉树的先序遍历非递归实现方法

#include "iostream"
using namespace std;

struct node {
    int key;
    node* left;
    node* right;
    node(){}
    node(int x):key(x),left(NULL),right(NULL){}
};
struct Tree {
    node* root;
    Tree():root(NULL){}
};
void push(node* S,node x)
{
    S[0].key++;
    S[S[0].key]=x;
}
node* pop(node* S)
{
    if (S[0].key==0) {
        return NULL;
    }
    S[0].key--;
    return &S[S[0].key+1];
}
void print_tree(Tree* T)
{
    node stack[20]={0};
    node* t=T->root;
    while (1) {
        //如果有节点,则一直往下输出所有的最左边的结点,同时用栈保存所有的结点
        cout<<t->key<<' ';
        push(stack,*t);
        if (t->left) {
            t=t->left;
        }
        else
        {
            do{
                //如果结点的右孩子不存在,则一直弹栈,测试上一个结点,
                //直到找到一个结点,它的右孩子存在为止,则将指针指向它的右孩子,重复外循环
                t=pop(stack);
                if (t==NULL) {
                    return;
                }
            }
            while (t->right==NULL) ;
                t=t->right;
        }
    }
}

void main()
{
    node A[11];
    for(int i=1;i<=10;i++)
    {
        int key,left,right;
        cin>>key>>left>>right;
        A[i].key=key;
        if (left) {
            A[i].left=&A[left];
        }
        else
            A[i].left=NULL;
        if (right) {
            A[i].right=&A[right];
        }
        else
            A[i].right=NULL;
    }
    Tree* T=new Tree();
    T->root=&A[6];
    print_tree(T);
}
输入用算法导论10.4-1的属性表构造二叉树
12 7 3 
15 8 0 
4 10 0 
10 5 9 
2 0 0 
18 1 4 
7 0 0 
14 6 2 
21 0 0 
5 0 0 

 

posted @ 2013-05-10 16:26  LS2012  阅读(133)  评论(0)    收藏  举报