数据结构——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
原创粉丝点击