二叉树创建以及遍历(递归和非递归方式)
2017-06-28 23:02
369 查看
#include <iostream> #include <assert.h> #include <stack> using namespace std; typedef struct biTreeNode { char data; struct biTreeNode *lChild; struct biTreeNode *rChild; }biTreeNode, *biTreePtr; /********************************创建**********************************/ void create_preOrder_ptr(biTreePtr* tree) { char ch; // cin >> ch;//C++风格,过滤掉空白字符(推荐) ch = getchar();//C语言风格,不会过滤掉空白字符(不推荐) if ('!' == ch) return; else { if (ch == '#') *tree = NULL; else { *tree = (biTreeNode*)malloc(sizeof(biTreeNode)); assert(*tree != NULL); (*tree)->data = ch; create_preOrder_ptr(&((*tree)->lChild)); create_preOrder_ptr(&((*tree)->rChild)); } } } void create_preOrder_ref(biTreePtr &tree) { char ch; cin >> ch; if ('!' == ch) return; else { if (ch == '#') tree = NULL; else { tree = (biTreeNode*)malloc(sizeof(biTreeNode)); assert(tree != NULL); tree->data = ch; create_preOrder_ref(tree->lChild); create_preOrder_ref(tree->rChild); } } } void create_preOrder_val(biTreePtr tree)//值传递的方式无效 { char ch; cin >> ch; if ('!' == ch) return; else { if (ch == '#') tree = NULL; else { tree = (biTreeNode*)malloc(sizeof(biTreeNode)); assert(tree != NULL); tree->data = ch; create_preOrder_val(tree->lChild); create_preOrder_val(tree->rChild); } } } /********************************三种递归遍历方式**********************************/ //先序遍历(递归) void traverse_preOrder_ref(biTreePtr proot) { if (proot) { cout << proot->data; traverse_preOrder_ref(proot->lChild); traverse_preOrder_ref(proot->rChild); } } //中序遍历(递归) void traverse_inOrder_ref(biTreePtr proot) { if (proot) { traverse_inOrder_ref(proot->lChild); cout << proot->data; traverse_inOrder_ref(proot->rChild); } } //后序遍历(递归) void traverse_postOrder_ref(biTreePtr proot) { if (proot) { traverse_postOrder_ref(proot->lChild); traverse_postOrder_ref(proot->rChild); cout << proot->data; } } /********************************三种非递归遍历方式**********************************/ //先序遍历(非递归) void traverse_preOrder2(biTreeNode *proot) { stack<biTreeNode*> stk; biTreeNode *p = proot; while(p != nullptr || !stk.empty()) { while(p != nullptr) { cout << p->data << ""; stk.push(p); p = p->lChild; } if(!stk.empty()) { p = stk.top(); stk.pop(); p = p->rChild; } } } //中序遍历(非递归) void traverse_inorder2(biTreeNode *proot) { stack<biTreeNode*> stk; biTreeNode *p = proot; while(p != nullptr || !stk.empty()) { while(p != nullptr) { stk.push(p); p = p->lChild; } if(!stk.empty()) { p = stk.top(); cout << p->data << ""; stk.pop(); p = p->rChild; } } } //后序遍历(非递归) int main() { //例:输入AB##CD##E##,如果输入不符合二叉树要求,按回车键不会退出创建过程 biTreePtr pTree = NULL; create_preOrder_ptr(&pTree); //create_preOrder_ref(tree); //create_preOrder_val(tree);//useless traverse_preOrder_ref(pTree); cout << endl; traverse_preOrder2(pTree); cout << endl; traverse_inOrder_ref(pTree); cout << endl; traverse_inorder2(pTree); cout << endl; traverse_postOrder_ref(pTree); cout << endl; return 0; }
相关文章推荐
- 二叉树的创建,以及递归前中后序以及层次遍历
- 二叉树创建以及遍历方式
- 二叉树的递归创建,以及二叉查找树查找的建立 和遍历查找的比较
- 二叉树的递归创建以及前序,中序,后序遍历
- 二叉树的创建以及递归非递归遍历
- 二叉树的存储方式以及递归和非递归的三种遍历方式
- 二叉树的先序遍历、中序遍历以及后序遍历(递归以及非递归方式)
- c++实现二叉树的非递归创建以及非递归先序、中序、后序遍历
- 二叉树的建立以及三种遍历方式的递归、非递归的实现
- 二叉树的存储方式以及递归和非递归的三种遍历方式
- 二叉树的存储方式以及递归和非递归的三种遍历方式
- 数据结构--树和二叉树--二叉树的创建和遍历(递归和非递归方式)
- 二叉树的创建、前序中序后序递归遍历与非递归遍历、层序遍历以及二叉树简单应用的C语言实现
- 【python中二叉树的实现】python中二叉树的创建、三种方式递归遍历和非递归遍历
- 二叉树的创建,插入,删除,输出,求高度,求度以及三种遍历方式实现
- 二叉树创建、前序遍历、中序遍历、后序遍历 的 递归与非递归实现 以及 层次遍历
- 二叉树的存储方式以及递归和非递归的三种遍历方式
- 二叉树的创建即遍历(递归方式)
- 二叉树的创建,先序、中序、后序遍历的递归实现以及层序遍历
- java版的二叉树的先序遍历、中序遍历以及后序遍历(递归以及非递归方式)