二叉树的先序、中序、后续遍历的递归和非递归实现

来源:互联网 发布:gradle mac 环境变量 编辑:程序博客网 时间:2024/05/01 21:50

今天复习了下二叉树的一些知识点,很久不接触发现不去主动去复习,很多知识长时间不去应用就回慢慢遗忘。所以最近慢慢的将以前的知识重新整理下。

二叉树在数据结构中占据着很重要的一个角色,至于什么叫二叉树,我在这就不去解释了,百度百科讲的已经很清楚了。我在这里主要用代码实现了二叉树的先序遍历、中序遍历和后序遍历的递归和非递归方法。

先序遍历的特点:首先访问根节点,再访问左子树,最后访问右子树。

中序遍历的特点:首先访问左子树,接着访问根节点,最后访问右子树。

后续遍历的特点:首先访问左子树,接着访问右子树,最后访问根节点。

层次遍历的特点:对于一个二叉树,按照从上到下,从左到右的顺序进行依次访问。

上图问一个二叉树,按照各个遍历方法的特点依次遍历顺序如下:

先序遍历:DBACFEG

中序遍历:ABCDEFG

后续遍历:ACBEGFD

层次遍历:DBFACEG



具体代码实现如下:

#include<stdio.h>#include<stdlib.h>#include <malloc.h>#include <stack>#define MAXSIZE 50typedef struct BinaryTree{char data;struct BinaryTree* pLeft;struct BinaryTree* pRight;}BinaryTree;//Binary Tree Nodetypedef struct StackTree{BinaryTree* b[MAXSIZE];int top;};//队列的结构体的表示形式typedef struct queueelem{BinaryTree* b[MAXSIZE];int front,rear;}Queue;//创建二叉树BinaryTree* CreateBinaryTree(){char cData;scanf_s("%c",&cData);getchar();if (cData == '#'){return NULL;}else{BinaryTree* pBTree = (BinaryTree*)malloc(sizeof(BinaryTree));if (NULL == pBTree){return NULL;}pBTree->data = cData;pBTree->pLeft = CreateBinaryTree();pBTree->pRight = CreateBinaryTree();return pBTree;}}//先序遍历:递归void PreOrder(BinaryTree* pBinaryTree){if (NULL == pBinaryTree){return;}printf_s("%c ",pBinaryTree->data);PreOrder(pBinaryTree->pLeft);PreOrder(pBinaryTree->pRight);}//先序遍历:非递归void PreOrderTraverse(BinaryTree* pBinaryTree){if (NULL == pBinaryTree){printf_s("该树为空树\n");return;}std::stack<BinaryTree*> Stack;while (NULL != pBinaryTree || !Stack.empty()){while (NULL != pBinaryTree){Stack.push(pBinaryTree);printf_s("%c ",pBinaryTree->data);pBinaryTree = pBinaryTree->pLeft;}pBinaryTree = Stack.top();Stack.pop();pBinaryTree = pBinaryTree->pRight;}}//中序遍历:递归void  InOrder(BinaryTree* pBinaryTree){if (NULL == pBinaryTree){return;}InOrder(pBinaryTree->pLeft);printf_s("%c ",pBinaryTree->data);InOrder(pBinaryTree->pRight);}//中序遍历:非递归void InOrderTraverse(BinaryTree* pBinaryTree){std::stack<BinaryTree*> Stack;if(NULL == pBinaryTree){printf_s("当前树为空树\n");return;}while (NULL != pBinaryTree || !Stack.empty()){while (NULL != pBinaryTree){Stack.push(pBinaryTree);pBinaryTree = pBinaryTree->pLeft;}pBinaryTree = Stack.top();Stack.pop();printf_s("%c ",pBinaryTree->data);pBinaryTree = pBinaryTree->pRight;}                     }//后序遍历:递归void PostOrder(BinaryTree* pBinaryTree){if ( NULL == pBinaryTree){return;}PostOrder(pBinaryTree->pLeft);PostOrder(pBinaryTree->pRight);printf_s("%c ",pBinaryTree->data);}//后序遍历:非递归void PosOrderTraverse(BinaryTree* pBinaryTree){//用一个标记标记右子数是否访问过int flag[50];std::stack<BinaryTree*> Stack;if (NULL == pBinaryTree){printf_s("当前树为空树\n");return;}while (NULL != pBinaryTree){Stack.push(pBinaryTree);flag[Stack.size()] = 0;pBinaryTree = pBinaryTree->pLeft;}while(!Stack.empty()){pBinaryTree = Stack.top();while (NULL != pBinaryTree->pRight && flag[Stack.size()] == 0){flag[Stack.size()] = 1;pBinaryTree = pBinaryTree->pRight;while (NULL != pBinaryTree){Stack.push(pBinaryTree);flag[Stack.size()] = 0;pBinaryTree = pBinaryTree->pLeft;}if (NULL == pBinaryTree){break;}}pBinaryTree = Stack.top();printf_s("%c ",pBinaryTree->data);Stack.pop();}}//树的高度int BinaryHight(BinaryTree* pBinary){int depth1;int depth2;if (NULL == pBinary){return 0;}else{depth1 = BinaryHight(pBinary->pLeft);depth2 = BinaryHight(pBinary->pRight);if (depth1 > depth2){return (depth1+1);}else{return (depth2+1);}}}//层次遍历void TraversalOfLevel(BinaryTree* pBinaryTree){Queue queue;queue.front = queue.rear =0;if (NULL == pBinaryTree){return;}else{printf_s("%c ",pBinaryTree->data);}queue.b[queue.front] = pBinaryTree;queue.rear++;while (queue.front < queue.rear){pBinaryTree = queue.b[queue.front];queue.front++;if(NULL != pBinaryTree->pLeft){printf_s("%c ",pBinaryTree->pLeft->data);queue.b[queue.rear] = (pBinaryTree->pLeft);queue.rear++;}if (NULL != pBinaryTree->pRight){printf_s("%c ",pBinaryTree->pRight->data);queue.b[queue.rear] = (pBinaryTree->pRight);queue.rear++;}}}int  main(){BinaryTree* pBinaryTree = CreateBinaryTree();printf_s("先序遍历:递归\n");PreOrder(pBinaryTree);printf_s("\n");printf_s("先序遍历:非递归\n");PreOrderTraverse(pBinaryTree);printf_s("\n");printf_s("中序遍历:递归\n");InOrder(pBinaryTree);printf_s("\n");printf_s("中序遍历:非遍历\n");InOrderTraverse(pBinaryTree);printf_s("\n");printf_s("后续遍历:递归\n");PostOrder(pBinaryTree);printf_s("\n");printf_s("后序遍历:非递归\n");PosOrderTraverse(pBinaryTree);printf_s("\n");printf_s("二叉树的高度:\n");int iHeight = BinaryHight(pBinaryTree);printf_s("%d",iHeight);printf_s("\n");printf_s("层次遍历:\n");TraversalOfLevel(pBinaryTree);printf_s("\n");free(pBinaryTree);}

测试结果:



2 0
原创粉丝点击