本文目录一览:
C语言 二叉树的建立
从键盘输入字符,然后回车,字符会停留在缓冲区内,之后你每次scanf("%c", ch)就会从缓冲区取出一个来
二叉树怎样用C语言实现
以下代码可实现二叉树的递归创建与中序遍历,但在输入时需在输入完有效数据后再连续输入多个负数才可以。
#include stdio.h
#include stdlib.h
typedef struct BitNode
{
int data;
struct BitNode *lchile,*rchild;
}*BiTree;
BiTree CreateBiTree(BiTree T)
{
int d;
scanf("%d",d);
if (d0)
return NULL;
else
{
if (!(T=(BiTree)malloc(sizeof(BiTree))))
{
exit(1);
}
T-data=d;//先根序创建二叉树
printf("%d ",T-data);
T-lchile=CreateBiTree(T-lchile);//创建左子树
T-rchild=CreateBiTree(T-rchild);//创建右子树
return T;
}
}
void InOrderView(BiTree T)//中序遍历二叉树
{
if(T)
{
InOrderView(T-lchile);
printf("%d ",T-data);
InOrderView(T-rchild);
}
}
void main()
{
BiTree T;
T=CreateBiTree(T);//递归创建二叉树
InOrderView(T);
}
完整正确的C语言二叉树程序
我有现成的,分享给大家了。
#includestdio.h
#includestdlib.h
#define maxsize 100
typedef struct btnode
{
int data ; //结点数据类型
struct btnode *lchild, *rchild; //定义左、右孩子为指针型
} bitree;
bitree *creat(bitree *t) //创建二叉树
{
bitree *s,*p,*q;
int x;
scanf("%d",x);
while(x!=0)
{
s= ( bitree *)malloc(sizeof(bitree));
s-data=x;
s-lchild=s-rchild=NULL;
if(t==NULL)
t=s;
else
{
p=t;
while(p)
{
q=p;
if(s-datap-data)
p=p-lchild;
else
p=p-rchild;
}
if(s-dataq-data)
q-lchild=s;
else
q-rchild=s;
}
scanf("%d",x);
}
return(t);
}
bitree *insert(bitree *t) //插入结点
{
bitree *s,*p,*q;
int x;
scanf("%d",x);
while(x!=0)
{
s= ( bitree *)malloc(sizeof(bitree));
s-data=x;
s-lchild=s-rchild=NULL;
if(t==NULL)
t=s;
else
{
p=t;
while(p)
{
q=p;
if(s-datap-data)
p=p-lchild;
else
p=p-rchild;
}
if(s-dataq-data)
q-lchild=s;
else
q-rchild=s;
}
scanf("%d",x);
}
return(t);
}
void search(bitree *t,int k) //查找数据
{
int flag=0;
while(t!=NULL)
{
if(t-data==k)
{
printf("已查到要找的数!\n");
flag=1;
break;
}
else
if(t-datak)
t=t-rchild;
else
t=t-lchild;
}
if(flag!=1)
printf("没有找到要查找的数据!\n");
}
bitree *dele(bitree *t,int k) //删除数据
{
int flag;
bitree *p,*q,*s=NULL,*f;
f=t;
while(t!=NULL) //查找数据
{
if(t-data==k)
{
printf("已找到所查找的数!\n");
break;
}
else
if(t-datak)
{
p=t;
t=t-rchild;
flag=0;
}
else
{
p=t;
t=t-lchild;
flag=1;
}
}
if(t-lchild==NULLt-rchild==NULL) //删除叶子结点
{
free(t);
if(flag==0)
p-rchild=NULL;
else
p-lchild=NULL;
}
else
{
if(t-lchild==NULLt-rchild!=NULL) //删除只有右子树的结点
{
if(flag==0)
p-rchild=t-rchild;
else
p-lchild=t-rchild;
free(t);
}
else
{
if(t-lchild!=NULLt-rchild==NULL) //删除只有左子树的结点
{
if(flag==0)
p-rchild=t-lchild;
else
p-lchild=t-lchild;
free(t);
}
else //删除左右子树都有的结点
{
p=t;
t=t-lchild;
q=t;
while(t-rchild)
{
q=t;
t=t-rchild;
}
if(t==q)
{
p-data=t-data;
p-lchild=t-lchild;
free(t);
}
else
{
p-data=t-data;
q-rchild=t-lchild;
free(t);
}
}
}
}
return(f);
}
void output(bitree * t) //实现二叉树的遍历
{
bitree *q[maxsize],*p;
int f,r;
q[0]=t;
f=r=0;
while (f=r)
{
p=q[f];
f++;
printf("%d ",p-data);
if(p -lchild!=NULL)
{
r++;
q[r]=p-lchild;
}
if (p-rchild!=NULL)
{
r++;
q[r]=p-rchild;
}
}
}
void main()
{
bitree *q=NULL,*r;
int m,n,x=1;
while(x==1)
{
system("cls");
printf(" ********************************\n");
printf(" 创建请按1\n");
printf(" 插入请按2\n");
printf(" 查找请按3\n");
printf(" 删除请按4\n");
printf(" 显示请按5\n");
printf(" 退出请按0\n");
printf(" ********************************\n");
scanf("%d",m);
switch(m)
{
case 1:printf("请输入数据并以'0'结束\n");
r=creat(q);system("pause");break;
case 2:printf("请输入数据并以'0'结束\n");
r=insert(r);break;
case 3:printf("请输入要查找的数:");
scanf("%d",n);
search(r,n);
system("pause");
break;
case 4:printf("请输入要删除的数:");
scanf("%d",n);
r=dele(r,n);
printf("已删除输入数据!\n");
system("pause");
break;
case 5:output(r);system("pause");printf("\n");
break;
case 0:x=0;break;
}
}
}
二叉树c语言实现
#includeiostream.h
#include stdio.h
#include stdlib.h
typedef struct node {
char data;
struct node *lchild,*rchild;//
}BiTNode,*BiTree;
void CreatBiTree(BiTree T)
{
char ch;
ch=getchar();
if (ch == ' ')
T = 0;
else {
T=(BiTNode*)malloc(sizeof(BiTNode));
T-data=ch;//生成根节点
CreatBiTree(T-lchild);//构造左子树
CreatBiTree(T-rchild);//构造右子树
}
}
void preorder(BiTree T)//前序遍历
{
if (T!=NULL){
printf ("%c",T-data);
preorder(T-lchild);
preorder(T-rchild);
}
}
void inorder(BiTree T)//中序遍历
{
if (T!=NULL){
inorder(T-lchild);
printf ("%c",T-data);
inorder(T-rchild);
}
}
void postorder(BiTree T)//后序遍历
{
if (T!=NULL){
postorder(T-lchild);
postorder(T-rchild);
printf ("%c",T-data);
}
}
void main ()
{
cout"请输入要创建的二叉树包括空格:"endl ;
BiTree T;
CreatBiTree(T);//创建二叉树
cout"前序遍历的结果为:"endl;
preorder(T);
coutendl;
cout"中序遍历的结果为:"endl;
inorder(T);
coutendl;
cout"后序遍历的结果为:"endl;
postorder(T);
}
数据结构二叉树的程序,用c语言怎么实现?
您好,想要实现一个二叉树,需要用到结构体来存储每个节点的信息,并使用指针来存储每个节点的左右子节点的地址。具体的实现方法可以参考下面的代码示例:
#include stdio.h
#include stdlib.h
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
};
struct TreeNode* createNode(int val) {
struct TreeNode* node = (struct TreeNode*) malloc(sizeof(struct TreeNode));
node-val = val;
node-left = NULL;
node-right = NULL;
return node;
}
void insertNode(struct TreeNode* root, int val) {
if (root == NULL) {
return;
}
if (val root-val) {
if (root-left == NULL) {
root-left = createNode(val);
} else {
insertNode(root-left, val);
}
} else {
if (root-right == NULL) {
root-right = createNode(val);
} else {
insertNode(root-right, val);
}
}
}
void printTree(struct TreeNode* root) {
if (root == NULL) {
return;
}
printf("%d\n", root-val);
printTree(root-left);
printTree(root-right);
}
int main() {
struct TreeNode* root = createNode(5);
insertNode(root, 3);
insertNode(root, 2);
insertNode(root, 4);
insertNode(root, 7);
insertNode(root, 6);
insertNode(root, 8);
printTree(root);
return 0;
}
在这段代码中,我们定义了一个结构体 TreeNode 来表示二叉树的每个节点,结构体中包含了一个节点的数值 val,以及指向左子节点和右子节点的指针 left 和 right。
二叉树的C语言程序求教
typedef char DataType;//给char起个别名 DataType
//定义二叉树的数据结构
typedef struct node{
DataType data;//二叉树存储的数据
struct node *lchild, *rchild;//二叉树的左、右子树的指针
}BinTNode;
typedef BinTNode *BinTree ; //自定义一个数据类型(二叉树的指针类型)
#include stdio.h
#include malloc.h
//以前序遍历构建二叉树
void CreatBinTree(BinTree *T)
{
char ch;//定义临时变量ch,用来接受数据
if ((ch=getchar())==' ')
*T=NULL;//如果输入为空,则停止构建二叉树
else{*T=(BinTNode *)malloc(sizeof(BinTNode));//为二叉树分配内存空间
(*T)-data=ch;//把输入的数据存入二叉树
CreatBinTree((*T)-lchild);//构建左子树(递归)
CreatBinTree((*T)-rchild);//构建左子树(递归)
}
}
//求二叉树的结点数
int Node(BinTree T)
{ int static nodes=0;//定义一个变量存储二叉树的结点数
if(T)//如果二叉树不为空(是结点),执行此语句
{
Node(T-lchild);//看左子树是不是个结点(递归)
nodes++;//结点数加1
Node(T-rchild);//看右子树是不是个结点(递归)
}
return nodes;//返回结点数
}
//求二叉树的叶子数
int Leaf(BinTree T)
{ int static leaves=0;//定义一个变量存储二叉树的叶子数
if(T)//如果二叉树不为空,执行此语句
{
Leaf(T-lchild);//看左子树是不是叶子(递归)
if(!(T-lchild||T-rchild))//如果二叉树T的左、右结点都为空,则执行此语句(即是叶子)
leaves++;//叶子数加1
Leaf(T-rchild);//看右子树是不是叶子(递归)
}
return leaves;//返回叶子数
}
#include stdio.h
void main()
{ BinTree root;
CreatBinTree(root);//构建二叉树
int nodes=Node(root);//求此二叉树的结点数
int leaves=Leaf(root);//求此二叉树的叶子数
printf("\nnodes=%d leaves=%d",nodes,leaves);
}
上面是我的理解,好久没有写过代码了,如有错误,请指出。