二叉树的遍历(先、中、后、层序)C实现
2017-08-13 17:30
411 查看
#include<stdio.h> #include<stdlib.h> #include<stack> using namespace std; typedef struct TreeNode* BiTree; typedef char ElementType; struct TreeNode{ ElementType Data; BiTree Left; BiTree Right; }; BiTree CreateTree() { ElementType ch; BiTree T = (BiTree)malloc(sizeof(struct TreeNode)); if(T == NULL){ printf("Over flow"); return NULL; } scanf("%c",&ch); if(ch == '#') T = NULL; else{ T->Data = ch; T->Left = CreateTree(); T->Right = CreateTree(); } return T; } void PreTraversal(BiTree T)//递归版本 先序遍历 { if(T != NULL){ printf("%c ",T->Data); PreTraversal(T->Left); PreTraversal(T->Right); } } void PreTraversalRe(BiTree T)//非递归前序遍历 { stack<BiTree> S; while(T != NULL || !S.empty()){ while(T != NULL){ printf("%c ",T->Data); S.push(T); T = T->Left; } if(!S.empty()){ T = S.top(); S.pop(); T = T->Right; } } } void InTraversal(BiTree T)//递归版本中序遍历 { if(T != NULL){ InTraversal(T->Left); printf("%c ",T->Data); InTraversal(T->Right); } } void InTraversalRe(BiTree T)//非递归中序遍历 { stack<BiTree> S; while(T != NULL || !S.empty()){ while(T != NULL){ S.push(T); T = T->Left; } if(!S.empty()){ T = S.top(); printf("%c ",T->Data); S.pop(); T = T->Right; } } } void PostTraversal(BiTree T)//递归版本 后续遍历 { if(T != NULL){ PreTraversal(T->Left); PreTraversal(T->Right); printf("%c ",T->Data); } } void PostTraversalRe(BiTree T) //非递归 后序遍历 { BiTree Pre = NULL; stack<BiTree> S; while(T != NULL || !S.empty()){ while(T != NULL){ S.push(T); T = T->Left; } T = S.top(); if(T->Right == NULL || Pre == T->Right){ printf("%c ",T->Data); S.pop(); Pre = T; T = NULL; //为了 继续取栈顶元素 } else{ T = T->Right; } } } void LevelOrderTraversal(BiTree T)//层序遍历 { deque<BiTree> Q; if(T == NULL) return; Q.push_back(T); while( !Q.empty()){ T = Q.front(); Q.pop_front(); printf("%c ",T->Data); if(T->Left != NULL) Q.push_back(T->Left); if(T->Right != NULL) Q.push_back(T->Right); } } int main() { BiTree BT; BT = CreateTree(); printf("递归先序遍历 :\n"); PreTraversal(BT); printf("\n非递归先序遍历 :\n"); PreTraversalRe(BT); printf("\n递归中序遍历 :\n"); InTraversal(BT); printf("\n非递归中序遍历 :\n"); InTraversalRe(BT); printf("\n递归后续遍历 :\n"); PostTraversalRe(BT); printf("\n非递归后续遍历 :\n"); PostTraversalRe(BT); printf("\n层序遍历 :\n"); LevelOrderTraversal(BT); return 0; }
相关文章推荐
- 实现一颗二叉树的层序遍历/给定一个整数N,那么N的阶乘N!末尾有多少个0呢
- 二叉树的遍历:前序,中序,后序,层序--包括递归和非递归实现(转)
- 二叉树的遍历:前序,中序,后序,层序--包括递归和非递归实现(转)
- C++实现二叉树 前序遍历, 后序遍历, 中序遍历, 层序遍历(不用递归)
- Java实现二叉树的前序、中序、后序、层序遍历(非递归方法)
- 二叉树--实现一颗二叉树的层序遍历
- 数据结构的C实现_二叉树的非递归遍历和层序遍历
- 二叉树的创建、前序中序后序递归遍历与非递归遍历、层序遍历以及二叉树简单应用的C语言实现
- 二叉树的遍历:前序,中序,后序,层序--包括递归和非递归实现
- Java实现的二叉树常用操作【前序建树,前中后递归非递归遍历及层序遍历】
- 二叉树的创建,先序、中序、后序遍历的递归实现以及层序遍历
- 二叉树的建立及层序遍历的实现
- 二叉树的遍历:前序、中序、后序、层序的非递归实现
- 二叉树的前序,中序,后序和层序遍历java实现
- java实现的二叉树(前序、中序、后序)递归和非递归遍历,包含层序遍历
- 二叉树层序遍历的实现
- 实现一颗二叉树的层序遍历
- Java实现二叉树的前序、中序、后序、层序遍历(递归方法)
- 二叉树的遍历:先序中序后序遍历的递归与非递归实现及层序遍历
- 一种二叉树层序遍历实现