这个是在视频上学习的二叉树的操作,风格稍微类似c以前的版本。
#include<iostream>
#include<stdlib.h>
#define maxn 100
using namespace std;
#include<string>
#include<string.h>
typedef struct node
{
char data;
node *lchild;
node *rchild;
}*bitree,bitnode;
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));//对右子树进行递归
} //将指针指向的左孩子的地址传给 bitree
}
bitree point(bitree t,char e)
{
bitree q[maxn]; //定义一个队列 用于存放二叉树终结点的指针
int front=0,rear=0; //初始化队列
bitnode *p; //遍历指针
if(t)
{
q[rear]=t;
rear++;
while(front!=rear) //如果队列非空
{
p=q[front]; // 取出头指针
front++;// 方便下一次取出
if(p->data==e) //如果找到
return p;
if(p->lchild) //如果p的左孩子节点存在 则入队列
{
q[rear]=p->lchild;
rear++;
}
if(p->rchild)
{
q[rear]=p->rchild;
rear++;
}
} //不停的进行查找
}
return NULL; //如果该指针为空 则返回无
}
int leftchild(bitree t,char e) //返回数据类型为data型的指针
{
bitree p;
if(t)
{
p=point(t,e);
if(p&&p->lchild)
return p->lchild->data;
}
}
int rightchild(bitree t,int e)
{
bitree p;
if(t)
{
p=point(t,e);
if(p&&p->rchild)
return p->rchild->data;
}
}
/*
int deleteleftchild(bitree p) //返回左删除成功的删除
{
if(p)
{
destroybittree(&(p->lchild));
return 1;
}
return 0;
}
int deleterightchild(bitree p) //右删除的成功
{
if(p)
{
destroybittree(&(p->rchild));
return 1;
}
return 0;
}
*/
void destroytree(bitree *t) //销毁二叉树操作
{
if(*t)
{
if((*t)->lchild)
destroytree(&((*t)->lchild));
if((*t)->rchild)
destroytree(&((*t)->rchild));
free(*t);// 释放当前的
*t=NULL;
}
}
void preorder(bitree t) //先序
{
if(t)
{
cout<<t->data;
preorder(t->lchild);
preorder(t->rchild);
}
}
void inorder(bitree t) //中序
{
if(t)
{
inorder(t->lchild);
cout<<t->data;
inorder(t->rchild);
}
}
void postorder(bitree t) //后序
{
if(t)
{
postorder(t->lchild);
postorder(t->rchild);
}
}
int main()
{
bitree p,root;
creattree(&p); //先序创建二叉树
preorder(p); //前序输出
cout<<endl;
inorder(p); // 中序输出
cout<<endl;
postorder(p); //后序输出
cout<<endl;
}