1.概述
二叉树的遍历是一个很常见的问题。二叉树的遍历方式主要有:先序遍历、中序遍历、后序遍历、层次遍历。先序、中序、后序其实指的是父节点被访问的次序。若在遍历过程中,父节点先于它的子节点被访问,就是先序遍历;父节点被访问的次序位于左右孩子节点之间,就是中序遍历;访问完左右孩子节点之后再访问父节点,就是后序遍历。不论是先序遍历、中序遍历还是后序遍历,左右孩子节点的相对访问次序是不变的,总是先访问左孩子节点,再访问右孩子节点。而层次遍历,就是按照从上到下、从左向右的顺序访问二叉树的每个节点。
四种主要的遍历思想为:
前序遍历:根结点 ---> 左子树 ---> 右子树
中序遍历:左子树---> 根结点 ---> 右子树
后序遍历:左子树 ---> 右子树 ---> 根结点
层次遍历:只需按层次遍历即可
例如,求下面二叉树的各种遍历
前序遍历: A B D E J H C F I
中序遍历: D B J E H A F C I
后序遍历: D J H E B F I C A
层次遍历:A B C D E F I J H
2.上代码
#include#include #define QUEUE_SIZE 5 typedef struct BTNode { char element; BTNode* left; BTNode* right; }BTNode,*BTNodePtr; typedef struct BTNodePtrQueue { BTNodePtr* nodePtrs; int front; int rear; }BTNodePtrQueue, *QueuePtr; QueuePtr initQueue() { QueuePtr resultQueuePtr = (QueuePtr)malloc(sizeof(struct BTNodePtrQueue)); resultQueuePtr->nodePtrs = (BTNodePtr*)malloc(QUEUE_SIZE * sizeof(BTNodePtr)); resultQueuePtr->front = 0; resultQueuePtr->rear = 1; resultQueuePtr; } bool isQueueEmpty(QueuePtr paraQueuePtr) { if ((paraQueuePtr->front + 1) % QUEUE_SIZE == paraQueuePtr->rear) { return true; } return false; } void enqueue(QueuePtr paraQueuePtr, BTNodePtr paraBTNodePtr) { printf("front = %d, rear = %dn",paraQueuePtr->front,paraQueuePtr->rear); if ((paraQueuePtr->rear + 1) % QUEUE_SIZE == paraQueuePtr->front % QUEUE_SIZE) { printf("Error, trying to enqueue %c. queue full.n",paraBTNodePtr->element); return; } paraQueuePtr->nodePtrs[paraQueuePtr->rear] = paraBTNodePtr; paraQueuePtr->rear = (paraQueuePtr->rear + 1) % QUEUE_SIZE; printf("enqueue %c ends.n",paraBTNodePtr->element); } BTNodePtr dequeue(QueuePtr paraQueuePtr) { if (isQueueEmpty(paraQueuePtr)) { printf("Error, empty queuen"); return NULL; } paraQueuePtr->front = (paraQueuePtr->front + 1) % QUEUE_SIZE; printf("dequeue %c ends.n",paraQueuePtr->nodePtrs[paraQueuePtr->front]->element); return paraQueuePtr->nodePtrs[paraQueuePtr->front]; } BTNodePtr constructBTNode(char paraChar) { BTNodePtr resultPtr = (BTNodePtr)malloc(sizeof(BTNode)); resultPtr->element = paraChar; resultPtr->right = NULL; resultPtr->left = NULL; return resultPtr; } BTNodePtr stringToBTree(char* paraString) { int i; char ch; QueuePtr tempQueuePtr = initQueue(); BTNodePtr resultHeader; BTNodePtr tempParent, tempLeftChild, tempRightChild; i = 0; ch = paraString[i]; resultHeader = constructBTNode(ch); enqueue(tempQueuePtr, resultHeader); while (!isQueueEmpty(tempQueuePtr)) { tempParent = dequeue(tempQueuePtr); i++; ch = paraString[i]; if (ch == '#') { tempParent->left = NULL; } else { tempLeftChild = constructBTNode(ch); enqueue(tempQueuePtr, tempLeftChild); tempParent->left = tempLeftChild; } i++; ch = paraString[i]; if (ch == '#') { tempParent->right = NULL; } else { tempRightChild = constructBTNode(ch); enqueue(tempQueuePtr, tempRightChild); tempParent->right = tempRightChild; } } return resultHeader; } void levelWise(BTNodePtr paraTreePtr) { char tempString[100]; int i = 0; QueuePtr tempQueuePtr = initQueue(); BTNodePtr tempNodePtr; enqueue(tempQueuePtr, paraTreePtr); while (!isQueueEmpty(tempQueuePtr)) { tempNodePtr = dequeue(tempQueuePtr); tempString[i] = tempNodePtr->element; i++; if (tempNodePtr->left != NULL) { enqueue(tempQueuePtr, tempNodePtr->left); } if (tempNodePtr->right != NULL) { enqueue(tempQueuePtr, tempNodePtr->right); } } tempString[i] = ' '; printf("LevelWise:-> %sn",tempString); } void preorder(BTNodePtr tempPtr) { if (tempPtr == NULL) { return; } printf("%c",tempPtr->element); preorder(tempPtr->left); preorder(tempPtr->right); } void inorder(BTNodePtr tempPtr) { if (tempPtr == NULL) { return; } inorder(tempPtr->left); printf("%c",tempPtr->element); inorder(tempPtr->right); } void postorder(BTNodePtr tempPtr) { if (tempPtr == NULL) { return; } postorder(tempPtr->left); postorder(tempPtr->right); printf("%c",tempPtr->element); } int main() { BTNodePtr tempHeader; tempHeader = constructBTNode('c'); printf("There is only one node. preorder visit:"); preorder(tempHeader); printf("rn"); char* tempString = "acde#bf######"; tempHeader = stringToBTree(tempString); printf("Preorder:-> "); preorder(tempHeader); printf("rn"); printf("Inorder:-> "); inorder(tempHeader); printf("rn"); printf("Postorder:-> "); postorder(tempHeader); printf("rn"); printf("LevelWise: n"); levelWise(tempHeader); printf("rn"); return 1; }
3.运行结果
There is only one node. preorder visit:c front = 0, rear = 1 enqueue a ends. dequeue a ends. front = 1, rear = 2 enqueue c ends. front = 1, rear = 3 enqueue d ends. dequeue c ends. front = 2, rear = 4 enqueue e ends. dequeue d ends. front = 3, rear = 0 enqueue b ends. front = 3, rear = 1 enqueue f ends. dequeue e ends. dequeue b ends. dequeue f ends. Preorder:-> acedbf Inorder:-> ecabdf Postorder:-> ecbfda LevelWise: front = 0, rear = 1 enqueue a ends. dequeue a ends. front = 1, rear = 2 enqueue c ends. front = 1, rear = 3 enqueue d ends. dequeue c ends. front = 2, rear = 4 enqueue e ends. dequeue d ends. front = 3, rear = 0 enqueue b ends. front = 3, rear = 1 enqueue f ends. dequeue e ends. dequeue b ends. dequeue f ends. LevelWise:-> acdebf



