二叉树 前序 中序 后序 递归 和非递归
来源:互联网 发布:淘宝店注册 编辑:程序博客网 时间:2024/06/06 08:25
#include "stdafx.h"#include "iostream"#include<queue> #include<stack>#include<stdlib.h>using namespace std;//BiTree #include <stdio.h> #include <malloc.h> //define #define OK 1 #define ERROR 0 //#define OVERFLOW -1 //typedef typedef int Status; typedef char TElemType; //struct typedef struct BiTNode{ TElemType data; struct BiTNode *lchild, *rchild; }BiTNode, *BiTree; Status CreateBiTree(BiTree &T) { char ch; scanf_s("%c", &ch); if (ch == ' ') T = NULL; else { if (!(T = (BiTNode *)malloc(sizeof(BiTNode)))) return OVERFLOW; T->data = ch; //Visit(T->data); CreateBiTree(T->lchild); CreateBiTree(T->rchild); } return OK; } void preOrder1(BiTNode *root) //非递归前序遍历 {stack<BiTNode*> s;BiTNode *p=root;while(p!=NULL||!s.empty()){while(p!=NULL){cout<<p->data<<" ";s.push(p);p=p->lchild;}if(!s.empty()){p=s.top();s.pop();p=p->rchild;}}}void preOrder2(BiTNode *root) {stack<BiTNode *>s;BiTNode *p=root;while (p||!s.empty()){if (p){s.push(p);cout<<p->data<<" ";p=p->lchild;}else{p=s.top();s.pop();p=p->rchild;}}}Status preOrder3(BiTree T, Status (* Visit)(TElemType e)){stack<BiTNode*>S;BiTNode *p;S.push(T);while (!S.empty()){p=S.top();//此时的p具有T的所有元素while (p){Visit(p->data);p=p->lchild;S.push(p);}S.pop();if(!S.empty()){p=S.top();S.pop();S.push(p->rchild);}}return OK;} void inOrder1(BiTNode *root){stack<BiTNode *>s;BiTNode *p=root;while (p||!s.empty()){while (p){s.push(p);p=p->lchild;}if (!s.empty()){p=s.top();cout<<p->data<<" ";s.pop();p=p->rchild;}}}void inOrder2(BiTNode *root){stack<BiTNode *>s;BiTNode *p=root;while(p||!s.empty()){if (p){s.push(p);p=p->lchild;}else{p=s.top();cout<<p->data<<" ";s.pop();p=p->rchild;}}}void inOrder3(BiTNode *root){if(root){inOrder3(root->lchild);cout<<root->data<<" ";inOrder3(root->rchild);}}void postOrder(BiTNode *root){stack<BiTNode *>s;BiTNode *cur;//当前结点BiTNode *pre=NULL;//前一次访问的结点s.push(root);while (!s.empty()){cur=s.top();if((cur->lchild==NULL&&cur->rchild==NULL)||(pre!=NULL&&(pre==cur->lchild||pre ==cur->rchild))){cout<<cur->data<<" ";s.pop();pre=cur;}else{if (cur->rchild!=NULL)s.push(cur->rchild);if (cur->lchild!=NULL)s.push(cur->lchild);}}}Status LeverOrderTraverse(BiTree T, Status (* Visit)(TElemType e)){if (T==0)return ERROR;queue <BiTree> Q;Q.push(T);while (Q.empty()==0){BiTree t=Q.front();Q.pop();Visit(t->data);if(t->lchild)Q.push(t->lchild);if(t->rchild)Q.push(t->rchild);}return OK;}Status Visit(TElemType e) { cout<<e<<" ";return OK; } //---------------------------------////叶子个数int leafcount1(BiTNode *root){if(root==NULL)return 0;else if (root->lchild==NULL&&root->rchild==NULL)return 1;else return leafcount1(root->lchild)+leafcount1(root->rchild);}int leafcount2(BiTNode *root){static int LeafNum=0;//叶子最初的数目if (root){if (root->lchild==NULL&&root->rchild==NULL){LeafNum++;}else{leafcount2(root->lchild);leafcount2(root->rchild);}}return LeafNum;}int main(){ BiTree T; CreateBiTree(T);cout<<"preOrder1:";preOrder1(T);cout<<endl;cout<<"preOrder2:";preOrder2(T);cout<<endl;cout<<"preOrder3:";preOrder3(T,Visit);cout<<endl;cout<<"-----------------------"<<endl;cout<<"inOrder1:";inOrder1(T);cout<<endl;cout<<"inOrder2:";inOrder2(T);cout<<endl;cout<<"inOrder3:";inOrder3(T);cout<<"-----------------------"<<endl;cout<<"(递归1)叶子结点数目:";cout<<leafcount1(T);cout<<endl;cout<<"(递归2)叶子结点数目:";cout<<leafcount2(T);cout<<endl;system("pause");return 0;}
0 0
- 二叉树的前序、中序、后序的实现(递归和非递归)
- 二叉树 前序 中序 后序 递归 和非递归
- 数据结构:二叉树的前序,中序,后序遍历(递归和非递归)
- 二叉树的递归和非递归遍历(前序、中序、后序)
- 【二叉树】 前序、中序和后序的递归遍历与非递归遍历
- 二叉树的前序,中序,后序遍历。用递归和非递归实现
- 二叉树的递归和非递归前、中、后序遍历
- 二叉树非递归前、中、后序遍历
- 二叉树非递归前、中、后序遍历实现
- 二叉树的非递归【前/中/后 序遍历】
- 非递归前,中,后序遍历二叉树
- 前,中,后序遍历二叉树 (递归 && 非递归的栈 && 非递归非栈的线索二叉树)
- 二叉树详解及二叉树的前序、中序、后序遍历(递归和非递归)
- 二叉树非递归前序和中序遍历
- 二叉树的前序、中序和后序(包括递归和非递归算法)
- 二叉树的前序遍历、中序遍历和后序遍历的递归和非递归算法
- 二叉树的非递归遍历方式(前序、中序和后序)
- 【二叉树】非递归遍历的通用算法:前序、中序和后序
- 贪心 4
- PHP数组传给js
- NSURLSession VS NSURLConnection
- dw代表几个字节
- 从零开始搭建架构实施Android项目
- 二叉树 前序 中序 后序 递归 和非递归
- 流苏岛之江湖情
- 流苏岛之三生石
- Python 练手程序合集(三)
- java中queue的使用
- poj1111 这道题目很巧妙的运用了反向思维来搜索
- nao机器人国际比赛程序 python编写
- CMD实现本地文件(夹)拷贝到服务器
- java 参数 -Xms -Xmx -Xss