头文件:
#include <stdio.h> struct 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; }