intCreateBiTree(BiTree &t)// 结构体指针要修改必须用 & 表示是引用类型{/**
创建二叉树 链式存储法 中序依次输入结点 包括空节点
**/int ch;scanf("%d",&ch);if(ch ==999){
t =NULL;return-1;}else{
t =(BiTree)malloc(sizeof(TNode));
t->data = ch;CreateBiTree(t->lchild);CreateBiTree(t->rchild);}return0;}voidinsertBiNode(BiTree &T,int number){/**
插入单个结点 从左至右,从上至下
**/if(T==NULL){//空树
T =(BiTree)malloc(sizeof(TNode));
T->data = number;
T->lchild =NULL;
T->rchild =NULL;}
Queen q =init_queen();
bool flag = false;
TNode * p = T;
TNode * temp;in_queen(q, p);while(q->front!=q->rear && flag==false){
p =out_queen(q);
temp =(TNode*)(malloc(sizeof(TNode)));
temp -> data = number;
temp->lchild =NULL;
temp ->rchild =NULL;if(p->lchild==NULL){
p->lchild = temp;
flag = true;}elseif(p->rchild==NULL){
p->rchild = temp;
flag = true;}else{in_queen(q, p->lchild);in_queen(q, p->rchild);}}}
先序遍历
intpre_bianli(BiTree T){// 先序遍历int height =0;// 求树的深度
Stack stack =init_Stack();// 初始化空栈
TNode* pre ,*p;
p = T;// 遍历指针
pre =NULL;//上一个访问的结点while(stack->top!=-1|| p!=NULL){// 栈不空或者遍历指针不空if(p!=NULL){
std::cout<<p->data<<",";// 先访问后入栈
pre = p;//记录最近访问结点push_stack(stack, p);
p = p->lchild;}else{if(stack->top+1> height){
height = stack->top+1;}
p =pop_stack(stack);//出栈if(p->rchild!=NULL&& p->rchild!=pre){
p = p ->rchild;}else{
p =NULL;}}}return height;}
中序遍历
intmid_bianli(BiTree T){//中序遍历int height =0;// 求树的深度
Stack stack =init_Stack();// 初始化空栈
TNode* pre ,*p;
p = T;// 遍历指针
pre =NULL;//上一个访问的结点while(stack->top!=-1|| p!=NULL){// 栈不空或者遍历指针不空if(p!=NULL){push_stack(stack, p);
p = p->lchild;}else{if(stack->top+1> height){
height = stack->top+1;}
p =pop_stack(stack);//出栈
std::cout<<p->data<<",";// 访问if(p->rchild!=NULL){
p = p ->rchild;}else{
p =NULL;}}}return height;}
后序遍历
intpost_bianli(BiTree T){//后序遍历int height =0;// 求树的深度
Stack stack =init_Stack();// 初始化空栈
TNode* pre ,*p;
p = T;// 遍历指针
pre =NULL;//上一个访问的结点while(stack->top!=-1|| p!=NULL){// 栈不空或者遍历指针不空if(p!=NULL){push_stack(stack, p);
p = p->lchild;}else{if(stack->top+1> height){
height = stack->top+1;}
p = stack->nodes[stack->top];// 取栈顶元素if(p->rchild!=NULL&& p->rchild!=pre){
p = p ->rchild;}else{
p =pop_stack(stack);//出栈
std::cout<<p->data<<",";// 出栈访问
pre = p;//记录最近访问结点
p =NULL;}}}return height;}
层次遍历
voidcengci_bianli(BiTree T){// 层次遍历int weight =0;int height =0;
Queen q =init_queen();// 初始化对列
TNode* p = T;in_queen(q, p);
TNode * last = p;// 记录每层的最后一个结点 当这个节点出队时更新while(q->front!=q->rear || p!=NULL){// 队列不空或者遍历指针不空
p =out_queen(q);
std::cout<<p->data<<",";if(p->lchild!=NULL){in_queen(q, p->lchild);}if(p->rchild!=NULL){in_queen(q, p->rchild);}if(p == last){// 高度更新
height ++;if((q->rear-q->front+q->size)%q->size > weight){// 宽度更新
weight =(q->rear-q->front+q->size)%q->size;}
last = q->nodes[(q->rear)%q->size];// 队尾元素是下一层的最后一个节点}
p =NULL;}
std::cout<<"树的高度为:"<<height<<"\n";
std::cout<<"树的宽度为:"<<weight<<"\n";}