#include <iostream>
#include <stack>
#include <queue>
using namespace std;
typedef struct node
{
int val;
struct node *left;
struct node *right;
//node(int x):val(x),left(NULL),right(NULL){}
}BiTreeNode,*BiTree;
class tree
{
public:
void createBiTree(BiTree &T) //&的意思是传进来节点指针的引用,括号内等价于 BiTreeNode* &T,目的是让传递进来的指针发生改变
{
int c;
cin >> c;
if(0 == c) //当遇到#时,令树的根节点为NULL,从而结束该分支的递归
T = NULL;
else
{
T = new BiTreeNode;
T->val=c;
createBiTree(T->left);
createBiTree(T->right);
}
}
queue<int> strtoint(string str)
{
int i=0,j=0,temp=0;
queue<int> res;
while (i<str.length())
{
if(str[i]=='#')
{
res.push(INT_MIN);
i=i+2;
continue;
}
j=i;
while(str[i]!='!')
i++;
while(j!=i)
{
temp=(str[j]-'0') + temp * 10;
j++;
}
res.push(temp);
temp=0;
i++;
}
return res;
}
bool Des(BiTree &T,queue<int> &res)
{
if(res.front()==INT_MIN)
{
res.pop();
return false;
}
T = new BiTreeNode;
T->val=res.front();
T->left=NULL;
T->right=NULL;
res.pop();
Des(T->left,res);
Des(T->right,res);
}
BiTree createBiTree2(string str)
{
queue<int> res;
node* root=NULL;
res=strtoint(str);
Des(root,res);
return root;
}
//前序遍历二叉树并打印
void preTraverse(BiTree T)
{
if(T)
{
cout<<T->val<<" ";
preTraverse(T->left);
preTraverse(T->right);
}
{
if(T)
{
stack<node *>s;
while(T||!s.empty())
{
while(T)
{
s.push(T);
cout<<T->val<<" ";
T=T->left;
}
node *top=s.top();
s.pop();
T=top->right;
}
cout<<endl;
}
}
//中序遍历二叉树并打印
void midTraverse(BiTree T)
{
if(T)
{
midTraverse(T->left);
cout<<T->val<<" ";
midTraverse(T->right);
}
}
void MidvOrder_NonR(BiTree T)
{
if(T)
{
stack<node *>s;
while(T||!s.empty())
{
while(T)
{
s.push(T);
T=T->left;
}
node *top=s.top();
cout<<top->val<<" ";
s.pop();
T=top->right;
}
cout<<endl;
}
}
//后续遍历二叉树并打印
void postTraverse(BiTree T)
{
if(T)
{
postTraverse(T->left);
postTraverse(T->right);
cout<<T->val<<" ";
}
}
void PostvOrder_NonR(BiTree T)
{
if(T)
{
stack<node *>s;
node *pre=NULL;
while(T||!s.empty())
{
while(T)
{
s.push(T);
T=T->left;
}
node *top=s.top();
if(top->right==NULL||pre==top->right)
{
cout<<top->val<<" ";
pre=top;
s.pop();
}
else
T=top->right;
}
cout<<endl;
}
}
//层序遍历二叉树
void print_tree(BiTree T)
{
queue<node *> rel;
rel.push(T);
while(!rel.empty())
{
node *front=rel.front();
cout<<front->val<<" ";
rel.pop();
if(front->left !=NULL)
rel.push(front->left);
if(front->right !=NULL)
rel.push(front->right);
}
cout<<endl;
{
if(!T)
return 0;
int left=Depth(T->left);
int right=Depth(T->right);
return (left>right ? left:right)+1;
}
void level(BiTree T,int lev)
{
if(T==NULL||lev<0)
return;
if(lev==0)
cout<<T->val<<" ";
level(T->left,lev-1);
level(T->right,lev-1);
}
void print_tree2(BiTree T)
{
int depth=Depth(T);
for(int i=0;i<depth;i++)
{
level(T,i);
}
cout<<endl;
}
};
int main()
{
string str="1!2!4!#!#!5!#!#!3!6!#!#!7!#!#!";
tree s;
BiTree T; //声明一个指向二叉树根节点的指针
T=s.createBiTree2(str);
//s.createBiTree(T);
cout<<"二叉树创建完成!"<<endl;
cout<<"前序遍历二叉树1:"<<endl;
s.preTraverse(T);
cout<<endl;
cout<<"前序遍历二叉树2:"<<endl;
s.PrevOrder_NonR(T);
cout<<"中序遍历二叉树1:"<<endl;
s.midTraverse(T);
cout<<endl;
cout<<"中序遍历二叉树2:"<<endl;
s.MidvOrder_NonR(T);
cout<<"后序遍历二叉树1:"<<endl;
s.postTraverse(T);
cout<<endl;
cout<<"后序遍历二叉树2:"<<endl;
s.PostvOrder_NonR(T);
cout<<"层序遍历二叉树2:"<<endl;
s.print_tree(T);
return 0;
}
#include <stack>
#include <queue>
using namespace std;
typedef struct node
{
int val;
struct node *left;
struct node *right;
//node(int x):val(x),left(NULL),right(NULL){}
}BiTreeNode,*BiTree;
class tree
{
public:
void createBiTree(BiTree &T) //&的意思是传进来节点指针的引用,括号内等价于 BiTreeNode* &T,目的是让传递进来的指针发生改变
{
int c;
cin >> c;
if(0 == c) //当遇到#时,令树的根节点为NULL,从而结束该分支的递归
T = NULL;
else
{
T = new BiTreeNode;
T->val=c;
createBiTree(T->left);
createBiTree(T->right);
}
}
queue<int> strtoint(string str)
{
int i=0,j=0,temp=0;
queue<int> res;
while (i<str.length())
{
if(str[i]=='#')
{
res.push(INT_MIN);
i=i+2;
continue;
}
j=i;
while(str[i]!='!')
i++;
while(j!=i)
{
temp=(str[j]-'0') + temp * 10;
j++;
}
res.push(temp);
temp=0;
i++;
}
return res;
}
bool Des(BiTree &T,queue<int> &res)
{
if(res.front()==INT_MIN)
{
res.pop();
return false;
}
T = new BiTreeNode;
T->val=res.front();
T->left=NULL;
T->right=NULL;
res.pop();
Des(T->left,res);
Des(T->right,res);
}
BiTree createBiTree2(string str)
{
queue<int> res;
node* root=NULL;
res=strtoint(str);
Des(root,res);
return root;
}
//前序遍历二叉树并打印
void preTraverse(BiTree T)
{
if(T)
{
cout<<T->val<<" ";
preTraverse(T->left);
preTraverse(T->right);
}
}
循环的前序遍历步骤:
1.先把根节点和根节点所有的左节点压入栈中,并在压入的同时把这个值打印出来
2.此时栈中最顶端的节点是最远左子节点,这个时候需要压入子节点的右子节点,并打印就行
3.每次出一个栈,就需要判断T和s是否为空
void PrevOrder_NonR(BiTree T){
if(T)
{
stack<node *>s;
while(T||!s.empty())
{
while(T)
{
s.push(T);
cout<<T->val<<" ";
T=T->left;
}
node *top=s.top();
s.pop();
T=top->right;
}
cout<<endl;
}
}
//中序遍历二叉树并打印
void midTraverse(BiTree T)
{
if(T)
{
midTraverse(T->left);
cout<<T->val<<" ";
midTraverse(T->right);
}
}
void MidvOrder_NonR(BiTree T)
{
if(T)
{
stack<node *>s;
while(T||!s.empty())
{
while(T)
{
s.push(T);
T=T->left;
}
node *top=s.top();
cout<<top->val<<" ";
s.pop();
T=top->right;
}
cout<<endl;
}
}
//后续遍历二叉树并打印
void postTraverse(BiTree T)
{
if(T)
{
postTraverse(T->left);
postTraverse(T->right);
cout<<T->val<<" ";
}
}
void PostvOrder_NonR(BiTree T)
{
if(T)
{
stack<node *>s;
node *pre=NULL;
while(T||!s.empty())
{
while(T)
{
s.push(T);
T=T->left;
}
node *top=s.top();
if(top->right==NULL||pre==top->right)
{
cout<<top->val<<" ";
pre=top;
s.pop();
}
else
T=top->right;
}
cout<<endl;
}
}
//层序遍历二叉树
void print_tree(BiTree T)
{
queue<node *> rel;
rel.push(T);
while(!rel.empty())
{
node *front=rel.front();
cout<<front->val<<" ";
rel.pop();
if(front->left !=NULL)
rel.push(front->left);
if(front->right !=NULL)
rel.push(front->right);
}
cout<<endl;
}
//层序遍历2
int Depth(BiTree T){
if(!T)
return 0;
int left=Depth(T->left);
int right=Depth(T->right);
return (left>right ? left:right)+1;
}
void level(BiTree T,int lev)
{
if(T==NULL||lev<0)
return;
if(lev==0)
cout<<T->val<<" ";
level(T->left,lev-1);
level(T->right,lev-1);
}
void print_tree2(BiTree T)
{
int depth=Depth(T);
for(int i=0;i<depth;i++)
{
level(T,i);
}
cout<<endl;
}
};
int main()
{
string str="1!2!4!#!#!5!#!#!3!6!#!#!7!#!#!";
tree s;
BiTree T; //声明一个指向二叉树根节点的指针
T=s.createBiTree2(str);
//s.createBiTree(T);
cout<<"二叉树创建完成!"<<endl;
cout<<"前序遍历二叉树1:"<<endl;
s.preTraverse(T);
cout<<endl;
cout<<"前序遍历二叉树2:"<<endl;
s.PrevOrder_NonR(T);
cout<<"中序遍历二叉树1:"<<endl;
s.midTraverse(T);
cout<<endl;
cout<<"中序遍历二叉树2:"<<endl;
s.MidvOrder_NonR(T);
cout<<"后序遍历二叉树1:"<<endl;
s.postTraverse(T);
cout<<endl;
cout<<"后序遍历二叉树2:"<<endl;
s.PostvOrder_NonR(T);
cout<<"层序遍历二叉树2:"<<endl;
s.print_tree(T);
return 0;
}