头文件:
#includestruct BinaryTreeNode { int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight; };
先序输入建立:
void Create_BT(BinaryTreeNode *&bt)//先序输入二叉树{ int d; scanf("%d",&d); if(d==-1)bt=NULL; else { bt=(BinaryTreeNode*)malloc(sizeof(BinaryTreeNode)); bt->m_nValue=d; Create_BT(bt->m_pLeft); Create_BT(bt->m_pRight); } }
三种遍历方法:
void PreOrder(BinaryTreeNode *bt){ if(bt!=NULL) { printf("%d\n",bt->m_nValue); PreOrder(bt->m_pLeft); PreOrder(bt->m_pRight); }}void InOrder(BinaryTreeNode *bt){ if(bt!=NULL) { InOrder(bt->m_pLeft); printf("%d\n",bt->m_nValue); InOrder(bt->m_pRight); }}void PostOrder(BinaryTreeNode *bt){ if(bt!=NULL) { PostOrder(bt->m_pLeft); PostOrder(bt->m_pRight); printf("%d\n",bt->m_nValue); }}void PreOrderStack(BinaryTreeNode *bt){ BinaryTreeNode *s[20];//栈 BinaryTreeNode *p=bt; int top=-1; while(p||top>-1) { while(p) { printf("%d\n",p->m_nValue); s[++top]=p; p=p->m_pLeft; } if(top>-1) { p=s[top]; top--; p=p->m_pRight; } }}void InOrderStack(BinaryTreeNode *bt){ BinaryTreeNode *s[20];//栈 BinaryTreeNode *p=bt; int top=-1; while(p||top>-1) { while(p) { s[++top]=p; p=p->m_pLeft; } if(top>-1) { p=s[top]; printf("%d\n",p->m_nValue); top--; p=p->m_pRight; } }}//后序二叉树非递归struct stacknode{ BinaryTreeNode *node; int tag;//tag=0表示左子女已访问,tag=1表示右子女已访问};void PostOrderStack(BinaryTreeNode *bt){ stacknode s[20];//栈 stacknode temp;//暂存结点信息 BinaryTreeNode *p=bt; int top=-1; while(p||top>-1) { while(p) { temp.node=p; temp.tag=0; s[++top]=temp; p=p->m_pLeft; } while(top>-1&&s[top].tag==1)//右子树已访问 { printf("%d\n",s[top--].node->m_nValue); } if(top>-1) { s[top].tag=1; p=s[top].node; p=p->m_pRight; } }}
main函数:
int main(){ while(true) { BinaryTreeNode *bt; Create_BT(bt); PreOrderStack(bt); InOrderStack(bt); PostOrderStack(bt); //PreOrder(bt); //InOrder(bt); //PostOrder(bt); } return 0;}