typedef struct BTNode { char data; //這裏默認結點data爲char型 struct BTNode *lchild; struct BTNode *rchild; }BTNode;
先序遍歷的操做以下。算法
若是二叉樹爲空樹,則什麼都不作;不然:數據結構
1)訪問根節點函數
2)先序遍歷左子樹post
3)先序遍歷右子樹code
描述以下:隊列
void preorder(BTNode *p) { if(p != NULL) { visit(p); //假設訪問函數Visit()已經定義過 preorder(p->lchild); //先序遍歷左子樹 preorder(p->rchild); //先序遍歷右子樹 } }
中序遍歷的操做以下。it
若是二叉樹爲空樹,則什麼都不作;不然:class
1)中序遍歷左子樹二叉樹
2)訪問根節點循環
3)中序遍歷右子樹
描述以下:
void inorder(BTNode *p) { if(p != NULL) { inorder(p->lchild); visit(p); inorder(p->rchild); } }
後序遍歷的操做以下。
若是二叉樹爲空樹,則什麼都不作;不然:
1)後序遍歷左子樹
2)後序遍歷右子樹
3)訪問根節點
描述以下:
void postorder(BTNode *p) { if(p != NULL) { postorder(p->lchild); postorder(p->rchild); visit(p); } }
<img src="https://irabbit756.oss-cn-shanghai.aliyuncs.com/數據結構/二叉樹遍歷/1二叉樹層次遍歷.png" style="zoom: 67%;" />
上圖所示爲二叉樹的層次遍歷,即按照箭頭所指方向,按照一、二、三、4的層次順序,對二叉樹中各個結點進行訪問(此圖反映的是自左至右的層次遍歷,自右至左的方式相似)
要進行層次遍歷,須要創建一個循環隊列先將二叉樹頭結點入隊列,而後出隊列,訪問該結點,若是它有左子樹,則將左子樹的根結點入隊;若是它有右子樹,則將右子樹的根結點入隊。而後出隊列,對出隊結點訪問。如此反覆,直到隊列爲空爲止。
由此獲得的對應算法以下:
void level(BTNode *p) { int front,rear; BTNode *que[maxSize]; //定義一個循環隊列,用來記錄將要訪問的層次上的結點 front = rear = 0; BTNode *q; if(p != NULL) { rear = (rear + 1) % maxSize; que[rear] = p; //根結點入隊 while(front != rear) //當隊列不空的時候進行循環 { front = (front + 1) % maxSize; q = que[front]; //隊頭結點出隊 visit(q); //訪問隊頭結點 if(q->lchild != NULL) //若是左子樹不空,則左子樹的根結點入隊 { rear = (rear + 1) % maxSize; que[rear] = q->lchild; } if(q->rchild != NULL) //若是右子樹不空,則右子樹的根結點入隊 { rear = (rear + 1) % maxSize; que[rear] = q->rchild; } } } }