c++实现二叉树层序、前序创建二叉树,递归非递归实现二叉树遍历
#include <iostream> #include <cstdio> #include <stdio.h> #include <string> #include <queue> #include <stack> using namespace std; class Node{ public : char data; struct Node *lchild,*rchild; }; class BiTree{ public: Node * root;//头结点 int height=0;//树的高度 BiTree() {root=NULL;} //层序创建二叉树 void create_level(string &s) { int p=0; root=new Node(); Node *t,*i,*j; queue<Node*> qTree;//定义一个队列,存储节点 while(true) { if(p==s.size())break; if(p==0)//当头结点未创建 { t=new Node(); t->data=s[p]参考地址:https://blog.csdn.net/ajay666/article/details/76736333、https://www.cnblogs.com/ybf-yyj/p/8717601.html; qTree.push(t);//头结点进队 root=t; p++; } else { t=qTree.front();//该节点出队 if(p==s.size())break;//树的构建完毕 if(s[p]=='#')//不存在左节点 { t->lchild=NULL; p++; } else//存在左节点 { i=new Node(); i->data=s[p]; t->lchild=i;//左节点进队 qTree.push(i); p++; } if(p==s.size())break; if(s[p]=='#')//不存在右节点 { t->rchild=NULL; p++; } else//存在右节点 { j=new Node(); j->data=s[p]; t->rchild=j; qTree.push(j); p++; } qTree.pop();//节点左右节点已创建,该节点出队 } } } //前序递归创建二叉树 void create_pre(string s) { int p=-1; root=create(s,p); } Node *create(string &s,int &p) { ++p; Node *t; if((unsigned)p>=s.size()) { return NULL; } else { if(s[p]=='#') { t=NULL; } else { t=new Node; t->data=s[p]; t->lchild=create(s,p); t->rchild=create(s,p); } return t; } } //前序递归遍历二叉树 void read_pre_oder(Node *t) { if(t!=NULL) { cout<<t->data<<' '; read_pre_oder(t->lchild); read_pre_oder(t->rchild); } } //中序递归遍历二叉树 void read_mid_oder(Node *t) { if(t!=NULL) { read_mid_oder(t->lchild); cout<<t->data<<' '; read_mid_oder(t->rchild); } } //后续递归遍历二叉树 void read_beh_oder(Node *t) { if(t!=NULL) { read_beh_oder(t->lchild); read_beh_oder(t->rchild); cout<<t->data<<' '; } } //利用栈实现前序遍历二叉树 void read_pre_oder_stack(Node *t) { if(t!=NULL) { stack<Node*> sTree;//声明一个栈存储节点 while(true) { if(sTree.size()==0&&t==NULL) break; while(true)//一直遍历左节点,输出 { if(t==NULL) break;//该节点不存在左节点,跳出循环 cout<<t->data<<' '; sTree.push(t);//节点进栈,以便后期遍历右节点 t=t->lchild; } t=sTree.top();//查看该节点是否存在右子树 sTree.pop();//节点已遍历出栈 /*遍历该节点右子树,若不存在右子树,继续循环, 存在则进入内部while循环查找该右子树的左节点*/ t=t->rchild; } } } //利用栈实现中序遍历二叉树 void read_mid_oder_stack(Node *t) { if(t!=NULL) { stack<Node*> sTree;//声明一个栈存储节点 while(true) { if(sTree.size()==0&&t==NULL) break; while(true) { if(t==NULL) break; sTree.push(t);//一直存储左节点 t=t->lchild; } t=sTree.top(); cout<<t->data<<' ';//不存在左节点,输出该节点 sTree.pop();//该节点出栈 t=t->rchild;//查找该节点的右子树 } } } //利用栈实现后序遍历二叉树 void read_beh_oder_stack(Node *t) { if(t!=NULL) { stack<Node*> sTree1;//该栈用于存储遍历过程的节点 stack<Node*> sTree2;//该栈用于存储遍历结果,输出 sTree1.push(t);//头节点进栈 while(true) { if (sTree1.size()==0) break; t=sTree1.top(); sTree1.pop(); if(t->lchild!=NULL)//存在左节点,节点进栈 { sTree1.push(t->lchild); } if(t->rchild!=NULL)//存在右节点,节点进栈 { sTree1.push(t->rchild); } sTree2.push(t);//存储该节点(第一步开始存储的就是头节点,头结点存储在栈底) } while(true)//输出 { if(sTree2.size()==0) break; t=sTree2.top(); cout<<t->data<<' '; sTree2.pop(); } } } //利用栈、队列实现层序遍历 void read_lev_oder_stack(Node *t) { if(t!=NULL) { stack<Node*> sTree; queue<Node*> qTree; sTree.push(t); qTree.push(t); while(true) { if(sTree.size()==0)break; t=sTree.top(); sTree.pop(); if(t->lchild!=NULL) { sTree.push(t->lchild); qTree.push(t->lchild); } if(t->rchild!=NULL) { sTree.push(t->rchild); qTree.push(t->rchild); } } while(true) { if(qTree.size()==0) break; t=qTree.front(); cout<<t->data<<' '; qTree.pop(); } } } //求树的高度 int tree_height(Node *t) { get_height(t,0); return height; } void get_height(Node *t,int h) { if(t==NULL) return; h++; if(h>height) { height=h; } get_height(t->lchild,h); get_height(t->rchild,h); } }; int main() { BiTree a; string s; s="ABD##E#F##C##"; // a.create_level(s); a.create_pre(s); cout<<"递归实现前序遍历"<<endl; a.read_pre_oder(a.root); cout<<endl<<"递归实现中序遍历"<<endl; a.read_mid_oder(a.root); cout<<endl<<"递归实现后序遍历"<<endl; a.read_beh_oder(a.root); cout<<endl; cout<<"栈实现前序遍历"<<endl; a.read_pre_oder_stack(a.root); cout<<endl<<"栈实现中序遍历"<<endl; a.read_mid_oder_stack(a.root); cout<<endl<<"栈实现后序遍历"<<endl; a.read_beh_oder_stack(a.root); cout<<endl<<"栈、队列实现层序遍历"<<endl; a.read_lev_oder_stack(a.root); cout<<endl<<"树的高度为: "<<endl; int height=a.tree_height(a.root); cout<<height<<endl; return 0; }
- c++实现二叉树的非递归创建以及非递归先序、中序、后序遍历
- C++实现二叉树所有操作 -- 创建递归遍历迭代遍历拷贝清空查找
- 二叉树的创建、前序中序后序递归遍历与非递归遍历、层序遍历以及二叉树简单应用的C语言实现
- C++实现二叉树的递归遍历与非递归遍历(先序、中序、后序、层序)
- 二叉树的创建,先序、中序、后序遍历的递归实现以及层序遍历
- C++实现二叉树 前序遍历, 后序遍历, 中序遍历, 层序遍历(不用递归)
- java实现二叉树的创建及三种递归遍历
- 二叉树的遍历(C++非递归实现)
- c++实现二叉树的先序遍历,中序遍历,后序遍历(递归方法)及运行实例结果
- 数据结构学习之-二叉树的三种递归遍历C++实现及相关应用
- c++实现二叉树的查找,插入,删除,深度,叶子节点数,度为1的节点数(递归方法)及运行实例结果
- 二叉树的实现(递归遍历和非递归遍历)C++
- 二叉树的创建、先序、中序、后序、层序的递归与非递归算法(java)
- C++实现二叉树非递归遍历方法实例总结
- <二叉树 前中后 层序 非递归遍历 c语言实现>
- 二叉树的创建(先序创建的)及先序遍历 中序遍历 后序遍历的递归和非递归实现
- c++实现二叉树(递归)
- c++实现二叉树的先序遍历,中序遍历,后序遍历(递归方法)及运行实例结果
- 二叉树的递归、非递归及层序遍历的Java实现
- 二叉树的创建,遍历,查找,查找父节点,深度,大小等的递归实现