本文目录一览:
- 1、c语言 二叉排序树 100分
- 2、用C语言实现二叉排序树的查找、插入和删除
- 3、C语言2叉排序树的问题,急
- 4、二叉排序树的实现(c语言)
- 5、C语言实现:二叉排序树结点的删除
- 6、C语言 关于二叉树排序树的建立及中序遍历程序的调试
c语言 二叉排序树 100分
#include stdio.h #include stdlib.h typedef struct _BiTNode { int val; struct _BiTNode* lhs; struct _BiTNode* rhs; }BiTNode; //建立二叉排序树 void inserttree(BiTNode** Tree, int val) //插入函数 { BiTNode* t, *p, *n; t = (BiTNode*)malloc(sizeof(BiTNode)); t-val = val; t-lhs = t-rhs = NULL; p = NULL, n = *Tree; while(n) { p = n; n = val n-val ? n-lhs : n-rhs; } (p ? val p-val ? p-lhs : p-rhs : *Tree) = t; } void buildBST(BiTNode** Tree) { int val; char c; *Tree = NULL; while(1) { scanf("%d", val); inserttree(Tree, val); if((c = getchar()) == '\n') break; else ungetc(c, stdin); } } //二叉排序树查找 BiTNode* search(BiTNode* Tree, int val) { while(Tree) { if(val Tree-val) Tree = Tree-lhs; else if(val Tree-val) Tree = Tree-rhs; else return Tree; } return NULL; } //二叉排序树删除 void del(BiTNode* Tree) { if(Tree) { del(Tree-lhs); del(Tree-rhs); free(Tree); } } int main() { return 0; }
用C语言实现二叉排序树的查找、插入和删除
#includestdio.h
//二分查找法或折半查找法
void main(){
int a[10]={1,3,5,9,13,16,17,26,38},count=0;//记录查找了多少次
//必须是有次的数组
int key,mid;//要查找的数字和折半后的下标
int pos=-1;//查找到的位置
int i=0,j=8;
printf("请输入要查找的数据:");
scanf("%d",key);
while(i=j){
count++;
mid=(i+j)/2;
if(key==a[mid]){
pos=mid+1;
break;
}
if(keya[mid])i=mid+1;
else j=mid-1;
}
if(pos==-1)
printf("对不起,没有找到你想要的数据!\n");
else
printf("该数据位于数组的第%d位\n共查找了%d次\n",pos,count);
}
删除
#includestdio.h
void main(){
int i,a[10]={1,3,4,5,7};
//下面看如何删除数组元素
//其实跟插入数据相反的道理
//比如删除a[1]这个元素,我们可以通过移动依次覆盖相应的位置
/*a[1]=a[2];
a[2]=a[3];
a[3]=a[4];*/
//这时候a[1]就已经被删除了
//把这段写成循环
for(i=1;i=3;++i)
a[i] = a[i+1];
for(i=0;i4;++i)
printf("%d ",a[i]);
}
C语言2叉排序树的问题,急
struct tree
{
int num;
struct tree *left;
struct tree *right;
};
int a[10]={4,9,0,1,8,6,3,5,2,7}
main()
{
int i,j,k;
struct tree *head,*p1,*p2,*p3;
p1-num=a[0];
p1-left=null;
p1-right=null;
head=p1;
for(i=0;i10;i++)
{
p2-num=a[0];
p2-left=null;
p2-right=null;
p1=head;
while(1)
{
p3=p1
if(p2-num=p1-num) p1=p1-right;
else p1=p1-left;
if(p1==null)
{
p3-left=p2;
breal;
}
}
}
//以上为建立树
inorder(head);
//编历
}
void inorder(struct tree *p)
{
if(p!=null)
{
inorder(p-left);
printf("%d",p-num);
inorder(p-right);
}
return;
}
本程序未经过调试,大体思路应该无误!
二叉排序树的实现(c语言)
/*二叉树的基本运算与实现*/
#include stdio.h
#include malloc.h
#define MAXNODE 256
typedef int datatype;
typedef struct BiTNode
{
datatype data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
typedef struct
{
BiTree link;
int flag;
}stacktype;void menu();
int Initiate(BiTree *bt,datatype x);
BiTree InsertL(BiTree bt,datatype x,BiTree parent);
BiTree InsertR(BiTree bt,datatype x,BiTree parent);
BiTree DeleteL(BiTree bt,BiTree parent);
BiTree DeleteR(BiTree bt,BiTree parent);
void PreOrder(BiTree bt);
void InOrder(BiTree bt);
void PostOrder(BiTree bt);
void LevelOrder(BiTree bt);
BiTree Find(BiTree parent,datatype a);
void NRPreOrder(BiTree bt);
void NRInOrder(BiTree bt);
void NRPostOrder(BiTree bt);void main()
{
int n,m=1;
BiTree t; /*clrscr();*/
while(m)
{
menu();
scanf("%d",n);
switch(n)
{
case 1:{/*初始化*/
int flag;
datatype x;
printf("please input head point x:\n");
scanf("%d",x);
flag=Initiate(t,x);
if(flag==1)
printf("\nInitiate success!");
else
printf("\nInitiate fail!");
break;
}
case 2:{/*建树*/
break;
}
case 3:{/*插入结点x作为a的左孩子*/
datatype a,x;/*x作为a的左孩子*/
BiTree parent=t;
printf("please input a and x:\n");
scanf("%d%d",a,x);
parent=Find(parent,a);
parent=InsertL(t,x,parent);
if(parent!=NULL)
t=parent;
break;
}
case 4:{/*插入结点x作为a的右孩子*/
datatype a,x;/*x作为a的右孩子*/
BiTree parent=t;
printf("please input a and x:\n");
scanf("%d%d",a,x);
parent=Find(parent,a);
parent=InsertR(t,x,parent);
if(parent!=NULL)
t=parent;
break;
}
case 5:{/*删除结点a的左孩子*/
datatype a;
BiTree parent=t;
printf("please input a:\n");
scanf("%d",a);
parent=Find(parent,a);
parent=DeleteL(t,parent);
if(parent!=NULL)
t=parent;
break;
}
case 6:{/*删除结点a的左孩子*/
datatype a;
BiTree parent=t;
printf("please input a:\n");
scanf("%d",a);
parent=Find(parent,a);
parent=DeleteR(t,parent);
if(parent!=NULL)
t=parent;
break;
}
case 7:{/*递归先序遍历*/
PreOrder(t);
break;
}
case 8:{/*递归中序遍历*/
InOrder(t);
break;
}
case 9:{/*递归后序遍历*/
PostOrder(t);
break;
}
case 10:{/*层次遍历*/
LevelOrder(t);
break;
}
case 11:{/*先序遍历的非递归实现*/
NRPreOrder(t);
break;
}
case 12:{/*中序遍历的非递归实现*/
NRInOrder(t);
break;
}
case 13:{/*后序遍历的非递归实现*/
NRPostOrder(t);
break;
}
case 0:m=0;
}
}
}
void menu()
{
/*clrscr();*/
printf("\n");
printf("\t\t1.initiate\n\n");
printf("\t\t2.create thread\n\n");
printf("\t\t3.insert Left\n\n");
printf("\t\t4.insert Right\n\n");
printf("\t\t5.delete Left\n\n");
printf("\t\t6.delete Right\n\n");
printf("\t\t7.preorder\n\n");
printf("\t\t8.inorder\n\n");
printf("\t\t9.postorder\n\n");
printf("\t\t10.levelorder\n\n");
printf("\t\t11.nrpreorder\n\n");
printf("\t\t12.nrinorder\n\n");
printf("\t\t13.nrpostorder\n\n");
printf("\t\t0.exit\n\n");
printf("\n\n\n\tplease select:");
}
int Initiate(BiTree *bt,datatype x)
{
if((*bt=(BiTNode*)malloc(sizeof(BiTNode)))==NULL)
return 0;
(*bt)-data=x;
(*bt)-lchild=NULL;
(*bt)-rchild=NULL;
return 1;
}
BiTree InsertL(BiTree bt,datatype x,BiTree parent)
{
BiTree p;
if(parent==NULL)
{
printf("\nerror!\n");
return NULL;
}
if((p=(BiTNode*)malloc(sizeof(BiTNode)))==NULL)
return NULL;
p-data=x;
p-lchild=NULL;
p-rchild=NULL;
if(parent-lchild==NULL)
parent-lchild=p;
else
{
p-lchild=parent-lchild;
parent-lchild=p;
}
return bt;
}
BiTree InsertR(BiTree bt,datatype x,BiTree parent)
{
BiTree p;
if(parent==NULL)
{
printf("\nerror!\n");
return NULL;
}
if((p=(BiTNode*)malloc(sizeof(BiTNode)))==NULL)
return NULL;
p-data=x;
p-lchild=NULL;
p-rchild=NULL;
if(parent-rchild==NULL)
parent-rchild=p;
else
{
p-rchild=parent-rchild;
parent-rchild=p;
}
return bt;
}
BiTree DeleteL(BiTree bt,BiTree parent)
{
BiTree p;
if(parent==NULL||parent-lchild==NULL)
{
printf("\ndelete error!");
return NULL;
}
p=parent-lchild;
parent-lchild=NULL;
free(p);
return bt;
}
BiTree DeleteR(BiTree bt,BiTree parent)
{
BiTree p;
if(parent==NULL||parent-rchild==NULL)
{
printf("\ndelete error!");
return NULL;
}
p=parent-rchild;
parent-rchild=NULL;
free(p);
return bt;
}
void PreOrder(BiTree bt)
{
if(bt==NULL)
return;
printf("%5d",bt-data);
PreOrder(bt-lchild);
PreOrder(bt-rchild);
}
void InOrder(BiTree bt)
{
if(bt==NULL)
return;
InOrder(bt-lchild);
printf("%5d",bt-data);
InOrder(bt-rchild);
}
void PostOrder(BiTree bt)
{
if(bt==NULL)
return;
PostOrder(bt-lchild);
PostOrder(bt-rchild);
printf("%5d",bt-data);
}
void LevelOrder(BiTree bt)
{
BiTree Queue[MAXNODE];
int front,rear;
if(bt==NULL)
{
return;
}
front = -1;
rear = 0;
Queue[rear] = bt;
while(front!=rear)
{
front++;
printf("%5d",Queue[front]-data);
if(Queue[front]-lchild!=NULL)
{
rear++;
Queue[rear]=Queue[front]-lchild;
}
if(Queue[front]-rchild!=NULL)
{
rear++;
Queue[rear]=Queue[front]-rchild;
}
}//end while
}
BiTree Find(BiTree parent,datatype a)
{
BiTree p;
if(parent==NULL)
p=NULL;
else if(parent-data==a)
p=parent;
else
{
p=Find(parent-lchild,a);
if(p==NULL)
p=Find(parent-rchild,a);
}
return p;
}
void NRPreOrder(BiTree bt)
{
BiTree stack[MAXNODE],p;
int top;
if(bt==NULL)
{
printf("Tree is empty!\n");
return;
}
top=-1;
p=bt;
while((p!=NULL)||(top!=-1))
{
while(p!=NULL)
{
printf("%5d",p-data);
if(top==MAXNODE-1)
{
printf("Stack overflow!\n");
return;
} /* end if */
else
{
top++;
stack[top]=p;
} /* end if-else */
p=p-lchild;
} /* end while p */
p=stack[top];
top--;
p=p-rchild;
} /* end while p top */
}
void NRInOrder(BiTree bt)
{
BiTree stack[MAXNODE],p;
int top;
if(bt==NULL)
{
printf("Tree is empty!\n");
return;
}
top=-1;
p=bt;
while((p!=NULL)||(top!=-1))
{
while(p!=NULL)
{
if(top==MAXNODE-1)
{
printf("Stack overflow!\n");
return;
} /* end if */
else
{
top++;
stack[top]=p;
} /* end if-else */
p=p-lchild;
} /* end while p */
p=stack[top];
top--;
printf("%5d",p-data);
p=p-rchild;
} /* end while p top */
}
void NRPostOrder(BiTree bt)
{
stacktype stack[MAXNODE];
BiTree p;
int top,sign;
if(bt==NULL)
{
printf("Tree is empty!\n");
return;
}
top=-1;
p=bt;
while((p!=NULL)||(top!=-1))
{
if(p!=NULL) /*结点第一次入栈*/
{
top++;
stack[top].link=p;
stack[top].flag=1; /*标记第一次入栈*/
p=p-lchild;
} /* end if */
else
{
p=stack[top].link;
sign=stack[top].flag;
top--;
if(sign==1) /*结点第二次入栈*/
{
top++;
stack[top].link=p;
stack[top].flag=2; /*标记第二次入栈*/
p=p-rchild;
} /* end if */
else
{
printf("%5d",p-data);
p=NULL;
} /* end if-else */
} /* end if-else */
} /* end while */
}
C语言实现:二叉排序树结点的删除
else
if((*t)-lchild==NULL)
(*t)=(*t)-rchild;
else
if((*t)-rchild==NULL)
(*t)=(*t)-lchild;
你确定你这个没有写错???左右孩子节点,都为空了你怎么还进入想进入进去?【估计你是这样想的】。。。但是安装你这个代码,只要左(右)孩子节点为空,你就直接把这个节点该删了,能不出错?【把一个空的孩子节点指向该节点】
C语言 关于二叉树排序树的建立及中序遍历程序的调试
看这个吧,跟你的设计一摸一样,有注释,你的没有注释,有些不怎么好理解。
#include
stdio.h
#include
stdlib.h
struct
tree//声明树的结构
{
struct
tree
*left,*right;
int
data;
};
typedef
struct
tree
treenode;//声明新类型树结构
typedef
treenode
*b_tree;//声明二叉树链表
//插入二叉树节点
b_tree
insert_node(b_tree
root,
int
node)
{
b_tree
newnode
;//声明树根指针
b_tree
currentnode;//声明目前节点指针
b_tree
parentnode;//声明父节点指针
//申请新节点的内存空间
newnode=(b_tree)malloc(sizeof(treenode));
newnode-data=node;//存入节点内容
newnode-right=NULL;//初始化右指针
newnode-left=NULL;
if(root==NULL)return
newnode;
else
{
currentnode=root;//存储目前节点指针
while(currentnode!=NULL)
{
parentnode=currentnode;//存储父节点指针
if(currentnode-datanode)//比较节点的数值大小
currentnode=currentnode-left;//左子树
else
currentnode=currentnode-right;//右子树
}
if(parentnode-datanode)//将父节点和子节点做链接
parentnode-left=newnode;//子节点为父节点的左子树
else
parentnode-right=newnode;//子节点为父节点的右子树
}
return
root;//返回根节点的指针
}
//建立二叉树
b_tree
create_btree(int
*data,int
len)
{
b_tree
root=NULL;
for(int
i=0;ilen;i++)
root=insert_node(root,data[i]);
return
root;
}
//二叉树中序遍历
void
in_order(b_tree
point)
{
if(point!=NULL)//遍历的终止条件
{
in_order(point-left);//遍历左子树
coutpoint-data"
";//打印节点的内容
in_order(point-right);//遍历右子树
}
}
//主程序
void
main()
{
b_tree
root=NULL;//树根指针
int
value;//暂存读入将要遍历的数值
int
nodelist[20];
int
index=0;
printf("请输入将要参与遍历的数值:\n");
//读数值到数组中,
//这是一种不知道数组元素到底有几个的情况下的输入方法
scanf("%d",value);
while(value!=0)
{
nodelist[index]=value;
index++;
scanf("%d",value);
}
//建立二叉树
root=create_btree(nodelist,index);
//中序遍历
printf("中序遍历二叉树结果如下\n");
in_order(root);
printf("\n");
}
/*
输入:6
3
1
9
5
7
4
8
0(退出)
结果:1
3
4
5
6
7
8
9
*/