二叉树的创建和遍历
来源:互联网 发布:淘宝店如何 编辑:程序博客网 时间:2024/05/29 17:48
/*二叉树的创建和遍历,有递归和非递归的形式*/#include <iostream>#include <stack>#include <queue>#include <cstdlib>//used in "malloc"using namespace std;//二叉树的节点typedef struct BitNode{ char data; struct BitNode *lchild,*rchild;}BitNode,*BitTree;int CreateBitTree(BitTree &T){ char data; scanf("%c",&data); if(data == '#'){ T = NULL; } else{ T = (BitTree)malloc(sizeof(BitNode)); T -> data = data; CreateBitTree(T -> lchild); CreateBitTree(T -> rchild); } return 0;}void Visit(BitTree T){ if(T -> data != '#'){ printf("%c",T->data); }}void PreOrder(BitTree T){ if(T != NULL){ Visit(T); PreOrder(T->lchild); PreOrder(T->rchild); }}void PreOrder2(BitTree T){ stack<BitTree> stack; BitTree p = T; while(p || !stack.empty()){ if(p != NULL){ stack.push(p); printf("%c",p->data); p = p->lchild; } else{ p = stack.top(); stack.pop(); p = p->rchild; } }}void InOrder(BitTree T){ if(T != NULL){ InOrder(T->lchild); Visit(T); InOrder(T->rchild); }}void InOrder2(BitTree T){ stack<BitTree> stack; BitTree p = T; while(p || !stack.empty()){ if(p != NULL){ stack.push(p); p = p->lchild; } else{ p = stack.top(); printf("%c",p->data); stack.pop(); p = p->rchild; } }}void PostOrder(BitTree T){ if(T != NULL){ PostOrder(T->lchild); PostOrder(T->rchild); Visit(T); }}void PostOrder2(BitTree T){ stack<BitTree> stack; BitTree curr = T;//指向当前要检查的节点 BitTree previsited = NULL;//指向前一个被访问的节点 while(curr != NULL || !stack.empty()){ while(curr != NULL){ //一直往走走直到为空 stack.push(curr); curr = curr->lchild; } curr = stack.top(); // 当前节点的右孩子如果为空或者已经被访问,则访问当前节点 if(curr -> rchild == NULL || curr->rchild == previsited){ printf("%c",curr->data); previsited = curr; stack.pop(); curr = NULL; } else curr = curr->rchild; //否则访问右节点 }}void LevelOrder(BitTree T){ BitTree p = T; queue<BitTree> queue; queue.push(p); while(!queue.empty()){ p = queue.front(); printf("%c",p->data); queue.pop(); if(p->lchild != NULL){ queue.push(p->lchild); } if(p->rchild != NULL){ queue.push(p->rchild); } }}int main() { BitTree T; CreateBitTree(T); printf("先序遍历:\n"); PreOrder(T); printf("\n"); printf("先序遍历(非递归):\n"); PreOrder2(T); printf("\n"); printf("中序遍历:\n"); InOrder(T); printf("\n"); printf("中序遍历(非递归):\n"); InOrder2(T); printf("\n"); printf("后序遍历:\n"); PostOrder(T); printf("\n"); printf("后序遍历(非递归):\n"); PostOrder2(T); printf("\n"); printf("层次遍历:\n"); LevelOrder(T); printf("\n"); return 0; }
1 0
- 二叉搜索树的创建和遍历
- 二叉树的创建,遍历和释放
- 简单的二叉树创建和遍历
- 二叉树的创建和遍历
- 二叉树的创建和遍历
- 二叉树的创建和遍历
- 二叉树的创建和遍历
- 二叉树的创建和遍历
- 数据结构---二叉树的创建和遍历
- 二叉树的创建和遍历
- 二叉树的创建和遍历
- 二叉树的创建和前序中序后序遍历
- 二叉树的创建和遍历
- 二叉树的创建和遍历
- 二叉树的创建和遍历
- 二叉查找树的创建和遍历
- 二叉树的递归创建和遍历
- 二叉树的创建和遍历
- C++中const在函数名前面和函数后面的区别
- 编写Python脚本来备份文件
- ios 加密本地资源
- Android 通过Socket 和服务器通讯
- Left Join
- 二叉树的创建和遍历
- StandardSession基本概述
- 最长公共子序列
- linux ssh 无密码登陆笔记
- iOS Storyboard全解析
- DButils 的使用
- 第14周项目1 折腾二维数组4
- 单例模式举例:恶汉模式,懒汉模式及其他
- solr教程