學習筆記:二叉樹後序遍歷非遞歸算法

#include <stack>
#include <iostream>
using namespace std;

typedef struct BiTNode{
	int data;
	BiTNode *lchild, *rchild;
}BiTNode,*BiTree;

void CreateBiTree(BiTree &T)//建樹,按先序順序輸入節點
{
    int ch;
    scanf("%d",&ch);
    if(ch==0)
    {
        T=NULL;
        return;
    }
    else
    {
    	if(!T){
    		T = new BiTNode;
    	}
        T->data=ch;
        T->lchild = T->rchild =NULL;
        cout<<T->data<<"的左子:"<<endl;
        CreateBiTree((T->lchild));
        cout<<T->data<<"右子:"<<endl;
        CreateBiTree((T->rchild));
    }
}

void myPostOrderTraverse(BiTree T){
	int flag[20];
	stack<BiTree> s;
	if(!T)
	{
		printf("空樹!\n");
		return;
	}
	do{
		while(T){
			s.push(T); //3 6,7
			T=T->lchild; //
			flag[s.size()]=0;
		}
		while(!s.empty()&&flag[s.size()]==1){
			T=s.top();
			s.pop();
			cout<<T->data<<endl;
		}
		if(!s.empty()){
			T=s.top(); //1 6, 7
			if(T->rchild==NULL){
				cout<<T->data<<endl;
				T=NULL;
				s.pop();
			}else{
				flag[s.size()]=1;
				T=T->rchild; //3 7
			}
		}
	}while(!s.empty());//!s.empty()
}

int main()
{

	BiTree T ;
	CreateBiTree(T);
	myPostOrderTraverse(T);
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章