#include <iostream>
#include <stdio.h>
#include <stack>
#include <queue>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
using namespace std;
typedef char TElemType;
typedef int Status;
typedef struct BiTNode
{
TElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode, *BiTree;
Status CreateBiTree(BiTree &T)
{
char ch;
cin>>ch;
if(ch=='#') T=NULL;
else
{
if(!(T=(BiTNode*)malloc(sizeof(BiTNode))))
exit(OVERFLOW);
T->data=ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
return OK;
}
void preOrder(BiTree T)//非递归的先序遍历
{
stack<BiTree> s;
BiTree p=T;
while(p||!s.empty())
{
while(p)
{
cout<<p->data;
s.push(p);
p=p->lchild;
}
if(!s.empty())
{
p=s.top();
s.pop();
p=p->rchild;
}
}
}
void midOrder(BiTree T)//非递归的中序遍历
{
stack<BiTree> s;
BiTree p=T;
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 endOrder(BiTree T)
{
stack<BiTree> s;
BiTree cur=T;
BiTree pre=NULL;
s.push(T);
while(!s.empty())
{
cur=s.top();
if((!cur->lchild&&!cur->rchild)||(pre&&(pre==cur->lchild||pre==cur->rchild)))
{
cout<<cur->data;
s.pop();
pre=cur;
}
else
{
if(cur->rchild)
{
s.push(cur->rchild);
}
if(cur->lchild)
{
s.push(cur->lchild);
}
}
}
}
int getHigh(BiTree T)
{
if(T==NULL)
return 0;
int re=0;
if(T->lchild)
{
re=max(re,getHigh(T->lchild));
}
if(T->rchild)
{
re=max(re,getHigh(T->rchild));
}
return re+1;
}
int sum=0;
void leavesNumber(BiTree T)
{
if(T!=NULL)
{
if(T->lchild==NULL&&T->rchild==NULL)
{
sum++;
}
leavesNumber(T->lchild);
leavesNumber(T->rchild);
}
}
int main()
{
BiTree T;
cout<<"按先序次序输入二叉树中节点的值(一个字符),#字符表示空树:"<<endl;
CreateBiTree(T);
cout<<"非递归的先序遍历:";
preOrder(T);
cout<<endl;
cout<<"非递归的中序遍历:";
midOrder(T);
cout<<endl;
cout<<"非递归的后序遍历:";
endOrder(T);
cout<<endl;
//postOrder3(T);
cout<<"该树的高度为:";
cout<<getHigh(T)<<endl;
cout<<"该树叶子节点的个数为:";
leavesNumber(T);
cout<<sum<<endl;
return 0;
}
#include <stdio.h>
#include <stack>
#include <queue>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
using namespace std;
typedef char TElemType;
typedef int Status;
typedef struct BiTNode
{
TElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode, *BiTree;
Status CreateBiTree(BiTree &T)
{
char ch;
cin>>ch;
if(ch=='#') T=NULL;
else
{
if(!(T=(BiTNode*)malloc(sizeof(BiTNode))))
exit(OVERFLOW);
T->data=ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
return OK;
}
void preOrder(BiTree T)//非递归的先序遍历
{
stack<BiTree> s;
BiTree p=T;
while(p||!s.empty())
{
while(p)
{
cout<<p->data;
s.push(p);
p=p->lchild;
}
if(!s.empty())
{
p=s.top();
s.pop();
p=p->rchild;
}
}
}
void midOrder(BiTree T)//非递归的中序遍历
{
stack<BiTree> s;
BiTree p=T;
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 endOrder(BiTree T)
{
stack<BiTree> s;
BiTree cur=T;
BiTree pre=NULL;
s.push(T);
while(!s.empty())
{
cur=s.top();
if((!cur->lchild&&!cur->rchild)||(pre&&(pre==cur->lchild||pre==cur->rchild)))
{
cout<<cur->data;
s.pop();
pre=cur;
}
else
{
if(cur->rchild)
{
s.push(cur->rchild);
}
if(cur->lchild)
{
s.push(cur->lchild);
}
}
}
}
int getHigh(BiTree T)
{
if(T==NULL)
return 0;
int re=0;
if(T->lchild)
{
re=max(re,getHigh(T->lchild));
}
if(T->rchild)
{
re=max(re,getHigh(T->rchild));
}
return re+1;
}
int sum=0;
void leavesNumber(BiTree T)
{
if(T!=NULL)
{
if(T->lchild==NULL&&T->rchild==NULL)
{
sum++;
}
leavesNumber(T->lchild);
leavesNumber(T->rchild);
}
}
int main()
{
BiTree T;
cout<<"按先序次序输入二叉树中节点的值(一个字符),#字符表示空树:"<<endl;
CreateBiTree(T);
cout<<"非递归的先序遍历:";
preOrder(T);
cout<<endl;
cout<<"非递归的中序遍历:";
midOrder(T);
cout<<endl;
cout<<"非递归的后序遍历:";
endOrder(T);
cout<<endl;
//postOrder3(T);
cout<<"该树的高度为:";
cout<<getHigh(T)<<endl;
cout<<"该树叶子节点的个数为:";
leavesNumber(T);
cout<<sum<<endl;
return 0;
}