二叉树的创建,先后序递归,非递归遍历,查找叶子结点。
#include <iostream>
using namespace std;
#define OK 1
#define ERROR 0
typedef int Status;
typedef char TElemType;
#define MAXSIZE 100
typedef struct BiTNode{
//结点数据域
TElemType data;
//左右孩子结点
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
//先序创建一个二叉树
void CreatTree(BiTree &T){
char ch;
cin>>ch;
if (ch == '#'){
T=NULL;
} else{
T = new BiTNode;
T->data = ch;
CreatTree(T->lchild);
CreatTree(T->rchild);
}
}
//中序遍历非递归
void InOrderTraverse(BiTree T){
BiTree q;
struct BiTNode *st[MAXSIZE];
int top = 0;
BiTree p = T;
q = new BiTNode;
while (p || top){
if (p){
st[top++] = p;
p = p->lchild;
}else{
q = st[--top];
cout<<q->data<<endl;
p = q->rchild;
}
}
}
//先序遍历非递归
void PreOrderTraverse(BiTree T){
BiTree q;
//栈的初始化
struct BiTNode *st[MAXSIZE];
//定义栈顶
int top = 0;
BiTree p = T;
q = new BiTNode;
while (p || top){
if (p){
st[top++] = p;
cout<<p->data<<endl;
p = p->lchild;
}else{
q = st[--top];
p = q->rchild;
}
}
}
//先序遍历递归
void PreOrderTraverse2(BiTree T){
if (T != NULL){
cout<<T->data<<endl;
PreOrderTraverse2(T->lchild);
PreOrderTraverse2(T->rchild);
}
}
//查找叶子数节点个数
Status pre_node(BiTree T,Status node) //求叶节点
{
if (T!=NULL) {
if (T->lchild == NULL && T->rchild == NULL) {
node++;
}
node = pre_node(T->lchild,node);
node = pre_node(T->rchild,node);
}
return node;
}
//输出函数
void OutPrint(){
BiTree T;
int choose = 0;
cout<<"1、先序创建一个二叉树"<<endl;
cout<<"2、中序遍历非递归"<<endl;
cout<<"3、先序遍历非递归"<<endl;
cout<<"4、先序遍历递归"<<endl;
cout<<"5、查找叶子节点个数"<<endl;
cout<<"0、退出系统"<<endl;
while (1){
cout<<"请输入要选择的功能前的序号:"<<endl;
cin>>choose;
if (choose == 0){
cout<<"系统退出成功"<<endl;
break;
}
switch (choose) {
case 1 :{
cout<<"请输入二叉树:"<<endl;
CreatTree(T);
break;
}
case 2 :{
cout<<"中序遍历非递归结果为:"<<endl;
InOrderTraverse(T);
break;
}
case 3 :{
cout<<"先序遍历非递归结果为:"<<endl;
PreOrderTraverse(T);
break;
}
case 4 :{
cout<<"先序遍历递归结果为:"<<endl;
PreOrderTraverse2(T);
break;
}
case 5 : {
int node = 0;
node = pre_node(T,node);
cout<<"叶子结点的个数为:";
cout<<node<<endl;
break;
}
}
}
}
int main() {
OutPrint();
return 0;
}