树的常用遍历
先定义树的结构体:
1 typedef struct BTNode{ 2 int data; 3 struct BtNode *lchild; 4 struct BTNode *rchild; 5 }BTNode;
树的递归调用的遍历:
1 void Traveorder(BTNode *p){ //1,2,3代表先序,中序,后序 2 if(p!=NULL){ 3 //(1)visit(p) 4 preorder(p->lchild); 5 //(2) 6 preorder(p->rchild); 7 //(3) 8 } 9 }
树的非递归遍历:
树的遍历要先右子树进栈才能保证左子树先出栈,以便于左子树先遍历。
1 //先序遍历 2 void PreorderNorecursion(BTNode *bt){ 3 if(bt!=NULL){ 4 BTNode *stack[maxsize];//定义栈 5 int top=-1;//栈顶 6 BTNode *p=NULL; 7 stack[++top]=bt; 8 while(top!=NULL){ 9 p=stack[top--]; 10 visit(p); 11 if(p->rchild!=NULL) 12 stack[++top]=p->rchild; 13 if(p->lchild!=NULL) 14 stack[++top]=p->lchild; 15 } 16 } 17 } 18 //后序遍历 19 void postorderNorecursion(BTNode *bt){ 20 if(bt!=NULL){ 21 BTNode *stack1[maxsize]; 22 int top1=-1; 23 BTNode *stack2[maxsize]; 24 int top2=-1; 25 BTNode *p=NULL; 26 stack[++top1]=bt; 27 while(top1!=-1){ 28 p=stack1[top1--]; 29 stack2[++top2]=p; 30 if(p->lchild!=NULL) 31 stack1[++top]=p->lchild; 32 if(p->rchild!=NULL) 33 stack1[++top]=p->rchild; 34 } 35 while(top2!=-1){ 36 p=stack[top--]; 37 visit(p); 38 } 39 } 40 //中序遍历 41 void inorderNorecursion(BTNode *bt){ 42 if(bt!=NULL){ 43 BTNode *stack[maxsize]; 44 int top=-1; 45 BTNode *p; 46 p=bt; 47 while(top!=-1||p!=NULL){ 48 whlie(p!=NULL){ 49 stack[++top]=p; 50 p=p->lchild; 51 } 52 if(top!=-1){ 53 p=stack[top--]; 54 visit(p); 55 p=p->rchild; 56 } 57 } 58 } 59 }
C++中的visit函数可以这样写:
1 void visit(BTNode *p){ 2 cout<<p->data<<endl; 3 }

浙公网安备 33010602011771号