二叉樹的遍歷實現
阿新 • • 發佈:2017-05-05
size 非遞歸算法 沒有 con nod order reorder 實現 traverse
二叉樹的先序遍歷
二叉樹的後序遍歷
//先序遍歷二叉樹的遞歸實現 void PreOrderTraverse(BiTree T) { if(T) { printf("%2c",T->data);//訪問根結點 PreOrderTraverse(T->lchild);//先序遍歷左子樹 PreOrderTraverse(T->rchild);//先序遍歷右子樹 } } //二叉樹的先序遍歷非遞歸算法 void PreOrderTraverse(BiTree T) { BiTree stack[MAXSIZE];//定義一個棧。用於存放結點的指針 int top;//定義棧頂指針 BitNode *p;//定義一個結點的指針 top=0;//初始化棧 p=T; while(p!=NULL||top>0) { while(p!=NULL)//假設p不空。訪問根結點。遍歷左子樹 { printf("%2c",T->data);//訪問根結點 stack[top++]=p;//將p入棧 p=p->lchild;//遍歷左子樹 } if(top>0)//假設棧不空 { p=stack[--top];//棧頂元素出棧 p=p->rchild;//遍歷右子樹 } } }
二叉樹的中序遍歷
//中序遍歷二叉樹的遞歸實現 void PreOrderTraverse(BiTree T) { if(T) { PreOrderTraverse(T->lchild);//中序遍歷左子樹 printf("%2c",T->data);//訪問根結點 PreOrderTraverse(T->rchild);//中序遍歷右子樹 } } //二叉樹的中序遍歷非遞歸算法 void PreOrderTraverse(BiTree T) { BiTree stack[MAXSIZE];//定義一個棧,用於存放結點的指針 int top;//定義棧頂指針 BitNode *p;//定義一個結點的指針 top=0;//初始化棧 p=T; while(p!=NULL||top>0) { while(p!=NULL)//假設p不空,訪問根結點,遍歷左子樹 { stack[top++]=p;//將p入棧 p=p->lchild;//遍歷左子樹 } if(top>0)//假設棧不空 { p=stack[--top];//棧頂元素出棧 printf("%2c",T->data);//訪問根結點 p=p->rchild;//遍歷右子樹 } } }
二叉樹的後序遍歷
//後序遍歷二叉樹的遞歸實現 void PreOrderTraverse(BiTree T) { if(T) { PreOrderTraverse(T->lchild);//後序遍歷左子樹 PreOrderTraverse(T->rchild);//後序遍歷右子樹 printf("%2c",T->data);//訪問根結點 } } //二叉樹的後序遍歷非遞歸算法 void PreOrderTraverse(BiTree T) { BiTree stack[MAXSIZE];//定義一個棧。用於存放結點的指針 int top;//定義棧頂指針 BitNode *p,*q;//定義結點的指針 top=0;//初始化棧 p=T,q=NULL; while(p!=NULL||top>0) { while(p!=NULL)//假設p不空。訪問根結點。遍歷左子樹 { stack[top++]=p;//將p入棧 p=p->lchild;//遍歷左子樹 } if(top>0)//假設棧不空 { p=stack[top-1];//取棧頂元素 if(p->rchild==NULL||p->rchild==q) //假設p沒有右孩子結點,或者右孩子結點已經訪問過 { printf("%2c",T->data);//訪問根結點 q=p; p=NULL; top--;//出棧 } else p=p->rchild; } } }
二叉樹的遍歷實現