#include<stdio.h>
#include"tree.h"
#include<stdlib.h>
#include"stack.h"
#include"queue.h"
#include<math.h>
Bitree CreateTree(Bitree p)//先序递归法建立二叉树
{
char c;
printf("input:");
scanf("%c",&c);
if(c=='#') p=NULL;
else{
p=(Bitree)malloc(sizeof(Binode));
p->alp=c;
getchar();
p->lchild=CreateTree(p->lchild);
getchar();
p->rchild=CreateTree(p->rchild);
}
return p;
}
void Visit(Bitree p)
{
printf("%c",p->alp);
}
void Preorder(Bitree p)//遍历的递归法
{
if(p!=NULL){
Visit(p);
Preorder(p->lchild);
Preorder(p->rchild);
}
}
void Inorder(Bitree p)
{
if(p!=NULL){
Inorder(p->lchild);
Visit(p);
Inorder(p->rchild);
}
}
void Postorder(Bitree p)
{
if(p!=NULL){
Postorder(p->lchild);
Postorder(p->rchild);
Visit(p);
}
}
void InorderTravel(Bitree p)//遍历非递归算法:中序
{
linkstack s;
initstack(&s);
Bitree t=p;
while(!empstack(s)||t)
{
while(t){push(&s,t);t=t->lchild;}
t=pop(&s);
Visit(t);
t=t->rchild;
}
}
void PreorderTravel(Bitree p)//先序
{
linkstack s;
initstack(&s);
Bitree t=p;
while(!empstack(s)||t)
{
while(t){push(&s,t);Visit(gettopstack(s));t=t->lchild;}
t=pop(&s);t=t->rchild;
}
}
void PostorderTravel(Bitree p)//后序
{
linkstack s;
initstack(&s);
Bitree t=p,l;
l=NULL;
while(!empstack(s)||t)
{
while(t) {push(&s,t);t=t->lchild;}
t=gettopstack(s);
t=t->rchild;
if(!t||t==l){l=pop(&s);Visit(l);t=NULL;}
}
}
void LevelTravel(const Bitree p)//层次遍历上下左右
{
linkqueue q;
initqueue(&q);
Bitree t;
if(!p) printf("empty tree");
else
{ t=p;
enqueue(&q,p);
while(!empqueue(q)){
t=dequeue(&q);Visit(t);
if(t->lchild) enqueue(&q,t->lchild);
if(t->rchild) enqueue(&q,t->rchild);
}
}
}
void InvertLevel(Bitree p)//下上右左,在上面加个栈
{
linkqueue q;
initqueue(&q);
linkstack s;
initstack(&s);
Bitree t;
if(!p) printf("empty tree");
else
{ t=p;
enqueue(&q,p);
while(!empqueue(q)){
t=dequeue(&q);push(&s,t);
if(t->lchild) enqueue(&q,t->lchild);
if(t->rchild) enqueue(&q,t->rchild);
}
}
while(!empstack(s)){t=pop(&s);Visit(t);}
}
void BitreeDepWid(Bitree p)//求二叉树的深度和宽度的非递归算法
{
linkqueue q;
initqueue(&q);
Bitree t,l;
l=t=p;
int n,dep,wid;
n=dep=wid=0;
if(p)
{
enqueue(&q,t);
while(!empqueue(q)){
t=dequeue(&q);n++;
if(t->lchild) enqueue(&q,t->lchild);
if(t->rchild) enqueue(&q,t->rchild);
if(t==l) {
dep++;
//l=getbasequeue(q);
//l=q.rear->bt;此句当q.rear为空的时候会出问题,->指向何处??
if(q.rear) l=q.rear->bt;
if(n>wid) wid=n;
n=0;
}
}
}
printf("dep=%d wid=%d\n",dep,wid);
}
int Depth(Bitree p)//二叉树深度的递归算法
{
if(!p) return 0;
return (Depth(p->lchild)>Depth(p->rchild)?Depth(p->lchild):Depth(p->rchild))+1;
}
int IsComplete(Bitree p)//判断是否完全二叉树
{
linkqueue q;//声明对象时不用malloc声明指针时要malloc
initqueue(&q);
Bitree t=p;
if(!p) return 1;
else {
enqueue(&q,t);
while(!empqueue(q))
{
t=dequeue(&q);
if(t){enqueue(&q,t->lchild);enqueue(&q,t->rchild);}
else {
while(!empqueue(q)){
t=dequeue(&q);
if(t) return 0;
}
}
}
return 1;
}
}
void Swapp(Bitree p)//交换左右子树
{
Bitree t=p;
if(t) {
t=p->lchild;
p->lchild=p->rchild;
p->rchild=t;
Swapp(p->lchild);
Swapp(p->rchild);
}
}
int BiCount(Bitree p)//计算一颗树度为二的节点数的和:1.递归2.递归遍历
{//先序的
if(!p) return 0;
else if(p->lchild&&p->rchild)
return BiCount(p->lchild)+BiCount(p->rchild)+1;
else
return BiCount(p->lchild)+BiCount(p->rchild);
}
void DeleteTree(Bitree p)//递归删除以p为根节点的树
{
if(p){
DeleteTree(p->lchild);
DeleteTree(p->rchild);
free(p);}
}
void BiDelx(Bitree p)//删除子树
{ char x;
if(!p) printf("no element in the tree\n");
else {
getchar();
printf("input x:");
scanf("%c",&x);
if(x==p->alp) DeleteTree(p);
else {Bitree t=p;
linkqueue q;
initqueue(&q);
enqueue(&q,t);
while(!empqueue(q))
{ t=dequeue(&q);
if(t->lchild)
{
if(t->lchild->alp==x) {DeleteTree(t->lchild);t->lchild=NULL;}
else enqueue(&q,t->lchild);
}
if(t->rchild)
{
if(t->rchild->alp==x) {DeleteTree(t->rchild);t->rchild=NULL;}
else enqueue(&q,t->rchild);
}
}
}
}
}
void SearchParent(Bitree p)//查找所有父节点
{
getchar();
char x;
printf("input x:");
scanf("%c",&x);
linkstack s;
initstack(&s);
Bitree t,l;
t=p;l=NULL;
while(t||!empstack(s))
{
while(t&&t->alp!=x) {push(&s,t);t=t->lchild;}
if(t) if(t->alp==x) break;//如果不加if(t),t为空时t->alp会导致内存问题
if(!t) {
t=gettopstack(s);
t=t->rchild;
if(t&&t!=l){if(t->alp==x) break;}
else {l=pop(&s);t=NULL;}
}
}
if(!empstack(s)) while(!empstack(s)){t=pop(&s);Visit(t);}
else printf("not found");
}
Bitree BST_Insert(Bitree p,char x)//二叉排序树的插入均是在叶子节点上进行的
{
Bitree t,l,k;
t=(Bitree)malloc(sizeof(Binode));
t->alp=x;
t->lchild=t->rchild=NULL;
if(!p) return t;
else { l=p;
while(l)
{ k=l;
if(x<k->alp) l=k->lchild;
else if(x>k->alp) l=k->rchild;
else {free(t);break;}
}
if(k->alp<x) k->rchild=t;
if(k->alp>x) k->lchild=t;
return p;
}
}
Bitree Create_BST()
{
Bitree p;
p=NULL;
getchar();
char ch;
printf("input :");
while((ch=getchar())!='#')
{
getchar();
p=BST_Insert(p,ch);
printf("input :");
}
return p;
}
/*
int Is_BST(Bitree p)//判断是否二叉排序树:1.非递归中序遍历2.层次遍历
{
linkstack s;
initstack(&s);
Bitree t=p,l;
l=NULL;
while(t||!empstack(s))
{
while(t) {push(&s,t);t=t->lchild;}
t=pop(&s);
if(l&&t->alp<l->alp) return 0;
l=t;
t=t->rchild;
}
return 1;
}
*/
int Is_BST(Bitree p)//二叉排序树判定_层次遍历.利用队列
{
linkqueue q;
initqueue(&q);
Bitree t;
t=p;enqueue(&q,t);
while(!empqueue(q))
{
t=dequeue(&q);
if(t->lchild) {
if(t->lchild->alp>t->alp) return 0;
else enqueue(&q,t->lchild);
}
if(t->rchild) {
if(t->rchild->alp<t->alp) return 0;
else enqueue(&q,t->rchild);
}
}
return 1;
}
int Is_Balence(Bitree p)// 是否平衡二叉树
{
if(p==NULL) return 1;
int ldep=Depth(p->lchild);
int rdep=Depth(p->rchild);
if(abs(ldep-rdep)>1) return 0;
else
return Is_Balence(p->lchild)&&Is_Balence(p->rchild);
}
二叉树基本操作
最新推荐文章于 2017-10-28 19:12:23 发布