二叉树遍历的三种方法:先序遍历,中序遍历,后序遍历
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树遍历的三种方法:先序遍历,中序遍历,后序遍历相关的知识,希望对你有一定的参考价值。
用二叉链表作为二叉树的物理存储结构;用先序遍历方法建立二叉树;分别用三种遍历方法输出已建立的二叉树结点
参考技术A #include "stdafx.h"#include<stdlib.h>
#include<math.h>
typedef struct bitnode
char data;
struct bitnode *lchild,*rchild;
bitnode,*bitree;
typedef struct qnode
bitree data;
struct qnode *next;
qnode;
typedef struct
qnode * front;
qnode * rear;
linkqueue;
int initqueue(linkqueue &q)
q.front=q.rear=(qnode*)malloc(sizeof(qnode));
if(!q.front) exit(OVERFLOW);
q.front->next=NULL;
return 1;
int enqueue(linkqueue &q,bitree e)
qnode *p;
p=(qnode*)malloc(sizeof(qnode));
if(!p) exit(OVERFLOW);
p->data=e;p->next=NULL;
q.rear->next=p;
q.rear=p;
return 1;
int outqueue(linkqueue & q,bitree &e)
qnode *p;
if(q.front==q.rear) return 0;
p=q.front->next;
e=p->data;
q.front->next=p->next;
if(q.rear==p)
q.rear=q.front;
return 1;
int createbitree(bitree &t)
char ch;
scanf("%c",&ch);
if(ch=='.')
t=NULL;
else
if(!(t=(bitnode*)malloc(sizeof(bitnode))))
exit(OVERFLOW);
t->data=ch;
createbitree(t->lchild);
createbitree(t->rchild);
return 1;
int visit(char e)
printf("%c",e);
return 1;
int preordertraverse(bitree t,int (*visit)(char e))
if(t)
if(visit(t->data))
if(preordertraverse(t->lchild,visit))
if(preordertraverse(t->rchild,visit)) return 1;
return 0;
else return 1;
int inordertraverse(bitree t,int (*visit)(char e))
if(t)
if(inordertraverse(t->lchild,visit))
if(visit(t->data))
if(inordertraverse(t->rchild,visit)) return 1;
return 0;
else return 1;
int postordertraverse(bitree t,int (*visit)(char e))
if(t)
if(postordertraverse(t->lchild,visit))
if(postordertraverse(t->rchild,visit))
if(visit(t->data))
return 1;
return 0;
else return 1;
void levelordertraverse(bitree t)
linkqueue q;
bitree e;
initqueue(q);
enqueue(q,t);
while(outqueue(q,e))
if(e)
visit(e->data);
enqueue(q,e->lchild);
enqueue(q,e->rchild);
int main(int argc, char* argv[])
bitree t;
printf("输入字符:");
createbitree(t);
printf("输出先序遍历:");
preordertraverse(t, visit);
printf("\n");
printf("输出中序遍历:");
inordertraverse(t,visit);
printf("\n");
printf("输出后序遍历:");
postordertraverse(t,visit);
printf("\n");
printf("输出层序遍历:");
levelordertraverse(t);
printf("\n");
return 0;
二叉树的三种遍历方式和实现(先序遍历,中序遍历,后序遍历)
【先序遍历】DLR:先根再左再右:A->B->C-D->E->F->G->H
[中序遍历] LDR:先左再根再右:B->D->C->E->A->F->H->G
【后序遍历】LRD:先左再右再中:D->E->C->B->H->G->F->A
图(1)
【先序遍历】DLR:先根再左再右:A->B->D->H->I->E->J->C->F->G
[中序遍历] LDR:先左再根再右:H->D->I->B->J->E->A->F->C->G
【后序遍历】LRD:先左再右再中:H->I->D->J->E->B->F->G->C->A
图(2)
针对图1的三种c++实现:
1 #include<iostream> 2 using namespace std; 3 4 //二叉树节点 5 struct BinaryNode 6 { 7 char ch; 8 BinaryNode* lchild; 9 BinaryNode* rchild; 10 }; 11 void Recursion(BinaryNode* root); 12 //初始化二叉树 13 void CreateBinaryTree() { 14 BinaryNode node1 = { ‘A‘,NULL,NULL }; 15 BinaryNode node2 = { ‘B‘,NULL,NULL }; 16 BinaryNode node3 = { ‘C‘,NULL,NULL }; 17 BinaryNode node4 = { ‘D‘,NULL,NULL }; 18 BinaryNode node5 = { ‘E‘,NULL,NULL }; 19 BinaryNode node6 = { ‘F‘,NULL,NULL }; 20 BinaryNode node7 = { ‘G‘,NULL,NULL }; 21 BinaryNode node8 = { ‘H‘,NULL,NULL }; 22 //建立节点关系 23 node1.lchild = &node2; 24 node1.rchild = &node6; 25 node2.rchild = &node3; 26 node3.lchild = &node4; 27 node3.rchild = &node5; 28 node6.rchild = &node7; 29 node7.lchild = &node8; 30 Recursion(&node1); 31 cout << endl; 32 } 33 //二叉树遍历 34 void Recursion(BinaryNode* root) { 35 if (!root) return; 36 cout << root->ch <<" "; 37 Recursion(root->lchild); //此结果为先序遍历,将第36行向下移动1行和2行分别为中序遍历和后续遍历 38 Recursion(root->rchild); 39 } 40 int main() { 41 CreateBinaryTree(); 42 }
先序遍历:
中序遍历:
后续遍历:
注意:在初始化二叉树函数中不应该使返回类型为BinaryNode* 型 因为返回node1地址时为局部变量,在出这个函数后其地址中的内容会被释放。
以上是关于二叉树遍历的三种方法:先序遍历,中序遍历,后序遍历的主要内容,如果未能解决你的问题,请参考以下文章