数据结构——18 二叉树(非递归)
来源:互联网 发布:夏俊峰案网络舆论 编辑:程序博客网 时间:2024/06/10 11:21
二叉树——非递归法
建立树时,按照左子树小于树根,右子树大于树根,这样中序遍历就是有序表
#include<iostream>#include<queue> //层级遍历时,用到了queue模板类#include<stack> //前中后遍历时,用到了stack模板类using namespace std;class node //树节点定义{public:int data; //元素值node *parent; //父节点node *left; //左子节点node *right; //右子节点int tag; //这个在后序遍历中用到,作为标志位public://node():data(-1),parent(NULL),left(NULL),right(NULL){};node(int num):data(num),parent(NULL),left(NULL),right(NULL),tag(0){}; //构造函数,初始化类成员变量};class tree //树定义{public:tree(int num[],int len); //构造函数void insertNode(int data); //安左低右高插入树的节点void preOrderTree(); //前序void inOrderTree(); //中序 void postOrderTree(); //后序void levelOrderTree(); //层级遍历private:node *root; //树的根节点};tree::tree(int num[],int len) //构造函数,插入树节点{root=new node(num[0]);for(int i=1;i<len;i++)insertNode(num[i]);}void tree::insertNode(int data){node *p,*par;node *newnode=new node(data);p=par=root;while(p){par=p;if(data > p->data)p=p->right;else if(data < p->data)p=p->left;else if(data == p->data){delete newnode;return;}}newnode->parent=par;if(par->data > newnode->data)par->left=newnode;elsepar->right=newnode;}void tree::preOrderTree() //先序遍历{stack<node *> s;node *p=root; //从根节点开始while(p|| !s.empty()) //树不为空或栈不为空{while(p) //遍历左子树,压入栈,入栈前,输出节点{cout<<p->data<<" ";s.push(p);p=p->left;}if(!s.empty()){p=s.top();s.pop();p=p->right;}}}void tree::inOrderTree() //中序遍历{stack<node *> s;node *p=root; //从根节点开始 while(p|| !s.empty()) //树不为空或栈不为空{while(p) //遍历左子树,压入栈{s.push(p);p=p->left;}if(!s.empty()){p=s.top(); //p指向栈顶s.pop(); //出栈cout<<p->data<<" ";p=p->right; //指向这个节点的右子树,遍历右子树做准备}}}void tree::postOrderTree() //后序遍历{stack<node *> s;node *p=root;while(p|| !s.empty()){while(p){s.push(p);p=p->left;}if(!s.empty()){p=s.top();if(p->tag) //tag为0表示遍历左子树前的保护现场,tag为1表示遍历右子树前的现场保护{cout<<p->data<<" ";s.pop();p=NULL;}else{p->tag=1;p=p->right;}}}}void tree::levelOrderTree() //层级遍历{queue<node *> q; //定义一个队列node *ptr=NULL;q.push(root);while(!q.empty()){ptr=q.front(); //得到队列的头节点q.pop(); //出队列cout<<ptr->data<<" ";if(ptr->left!=NULL) //当前节点存在左节点,左节点入队q.push(ptr->left);if(ptr->right!=NULL) //当前节点存在右节点,右节点入队q.push(ptr->right);}}int main(){int num[8]={5,3,7,2,4,6,8,1};tree t(num,8);cout<<"前序遍历: ";t.preOrderTree();cout<<endl<<endl;cout<<"中序遍历: ";t.inOrderTree();cout<<endl<<endl;cout<<"后序遍历: ";t.postOrderTree();cout<<endl<<endl;cout<<"层级遍历: ";t.levelOrderTree();cout<<endl;return 0;}
1 0
- 数据结构——18 二叉树(非递归)
- 数据结构——二叉树(递归与非递归遍历)
- 数据结构—二叉树遍历—非递归算法
- 数据结构之二叉树遍历(递归和非递归)
- 数据结构-二叉树(包含递归和非递归版本)
- 【数据结构】二叉树的遍历(递归与非递归)
- 数据结构——排序/搜索二叉树(非递归)的基本操作实现
- 数据结构——二叉树的四种遍历方式(非递归)
- 大话数据结构(七)——二叉树创建与遍历(递归、非递归)的java实现
- 二叉树的先序、中序、后序遍历方法(递归与非递归方法)——《数据结构》
- 数据结构——二叉树的递归与非递归遍历(先序,中序,后序)
- 数据结构--非递归遍历二叉树(利用辅助栈)
- 【数据结构与算法】二叉树深度遍历(非递归)
- C++数据结构: 二叉搜索树 (非递归)
- 【数据结构】Java实现二叉树遍历(非递归)
- 数据结构之二叉树:先中后序遍历(非递归)
- 数据结构----二叉树非递归实现
- 数据结构 二叉树的非递归遍历
- C#初学者json解析
- 数据结构实验之二叉树六:哈夫曼编码
- Android 内存优化 (防Memory Leak)
- android开发步步为营之110:android反编译apk
- 《TCP/IP详解 卷1:协议》 读书笔记 第11章 UDP:用户数据报协议
- 数据结构——18 二叉树(非递归)
- Java函数的基础介绍
- 排序算法
- 华为机试第一题[2016年8月18日上午]计算重复字符
- EventBus详解
- iOS中集成ijkplayer视频直播框架
- busybox login: root Login incorrect
- xctool的使用
- Android 内存管理 &Memory Leak & OOM 分析