c树形结构源代码(c语言 树结构)
admin 发布:2022-12-19 12:40 125
本篇文章给大家谈谈c树形结构源代码,以及c语言 树结构对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、求树与二叉树的转换c语言代码
- 2、数据结构创建一棵树的c语言代码怎么写?
- 3、数据结构二叉树的程序,用c语言怎么实现?
- 4、用c语言写二叉树,源代码。
- 5、C语言树的代码,谁有啊?就是InitTree(&T)什么的,包括插入子树,返回某个节点子树,越全越好!
- 6、求数据结构(C语言版)建立二叉树的代码~~急~~谢谢了
求树与二叉树的转换c语言代码
#includestdio.h
#includemalloc.h
#define DEGREE 5 //树的高度
#define NULL 0
#define QUEUESIZE 10
#define MAX_NODE_NUM 100
/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@树和二叉树的结构体@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
typedef struct st1//树节点的类型
{
char data;//数据域,采用char星
struct st1 *children[DEGREE];//指向孩子节点的指针域
}CTreeNode;
typedef struct st2
{
char data;//数据域
struct st2 *lchild,*rchild;//左右孩子节点的指针
}BTreeNode;
/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@查找树的节点@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
CTreeNode *SearchCTree(CTreeNode *root ,char data)
{
int i;
CTreeNode *returnNode;
if(root-data==data)
return root;
else
{
for(i=0;iDEGREE;i++)
{
if(root-children[i]==NULL)
return NULL;
else
{
returnNode=SearchCTree(root-children[i],data);//递归查找
if(returnNode!=NULL)
return returnNode;
}
}
}
}
/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@生成树@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
CTreeNode *CreateSTree()
{
int i,j,k;
char data, parent;;
CTreeNode *root,*parentNode,*node;
printf("请输入树的节点的数量:");
scanf("%d",j);
fflush(stdin);//清除键盘缓存
if(j==0)
return NULL;//空树,结束函数
printf("请输入根节点的数据:");
scanf("%c",data);
fflush(stdin);
root=(CTreeNode *)malloc(sizeof(CTreeNode));
root-data=data;
for(i=0;iDEGREE;i++)
root-children[i]=NULL;
for(i=2;i=j;i++)//依次输入每个节点的信息
{
printf("请输入第%d个节点的数据及其父节点的数据:",i);
scanf("%c%c",data,parent);//切记当以%c号格式输入数据时候,不要输入空格
fflush(stdin);
node=(CTreeNode *)malloc(sizeof(CTreeNode));
node-data=data;
for(k=0;kDEGREE;k++)
node-children[k]=NULL;
//printf("验证parent=%c\n",parent);
parentNode=SearchCTree(root,parent);//查找指定数据的节点
for(k=0;kDEGREE;k++)
{
if(parentNode-children[k]==NULL)
{
parentNode-children[k]=node;
break;
}
}
}
return root;
}
/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@树的遍历@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
void preorderTree(CTreeNode *ctroot)//遍历每个节点的操作就是输出该节点的data域
{
CTreeNode *ctchild;
int i;
printf("%c",ctroot-data);//先遍历根节点
for(i=0;iDEGREE;i++)//依次先序遍历孩子节点
{
ctchild=ctroot-children[i];
if(ctchild==NULL)
break;//孩子节点遍历结束,退出
else
preorderTree(ctchild);//递归先序遍历
}
}
/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@结构体类型@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
//树队列结构体类型
typedef struct nodeCTree
{
CTreeNode *CTreeArray[MAX_NODE_NUM];//结构体指针数组,存放节点的地址
//struct nodeCTree *next;
int CTreeFront,CTreeRear;
}QueueCTree;
//二叉树队列结构类型
typedef struct nodeBTree
{
BTreeNode *BTreeArray[MAX_NODE_NUM];//结构体指针数组,存放节点的地址
//struct nodeBTree *next;
int BTreeFront,BTreeRear;
}QueueBTree;
/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@初始化队列@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
//初始化树队列
void initQueueCTree(QueueCTree *q)
{
q=(QueueCTree *)malloc(sizeof(QueueCTree));
q-CTreeFront=q-CTreeRear=0;
}
//初始化二叉树队列
void initQueueBTree(QueueBTree *q)
{
q=(QueueBTree *)malloc(sizeof(QueueBTree));
q-BTreeFront=q-BTreeRear=0;
}
/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@入队列@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
//树队列元素入队
int addQueueCTree(QueueCTree *q,CTreeNode *ctroot)//
{
if((q-CTreeRear+1)%MAX_NODE_NUM==q-CTreeFront)//队满
return 0;
q-CTreeRear=(q-CTreeRear+1)%MAX_NODE_NUM;
q-CTreeArray[q-CTreeRear]=ctroot;
return 1;//入队列
}
//二叉树队列元素入队
int addQueueBTree(QueueBTree *q,BTreeNode *btroot)
{
if((q-BTreeRear+1)%MAX_NODE_NUM==q-BTreeFront)//队满
return 0;
q-BTreeRear=(q-BTreeRear+1)%MAX_NODE_NUM;
q-BTreeArray[q-BTreeRear]=btroot;
return 1;//入队列
}
/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@队列判空@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
//树的队列判空
int QueueCTreeEmpty(QueueCTree *q)
{
return(q-CTreeFront==q-CTreeRear);
}
//二叉树队列判空
int QueueBTreeEmpty(QueueBTree *q)
{
return(q-BTreeFront==q-BTreeRear);
}
/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@出队列@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
//树队列元素出队
CTreeNode *delQueueCTree(QueueCTree *q)
{
CTreeNode *ctroot;
if(q-CTreeFront==q-CTreeRear)//队空
return NULL;//返回空指针
q-CTreeFront=(q-CTreeFront+1)%MAX_NODE_NUM;
ctroot=q-CTreeArray[q-CTreeFront];
return ctroot;//返回节点
}
//二叉树队列元素出队
BTreeNode *delQueueBTree(QueueBTree *q)
{
BTreeNode *btroot;
if(q-BTreeFront==q-BTreeRear)//队空
return NULL;//返回空指针
q-BTreeFront=(q-BTreeFront+1)%MAX_NODE_NUM;
btroot=q-BTreeArray[q-BTreeFront];
return btroot;//返回节点
}
/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@树转化为二叉树@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
void TreeToBTree(CTreeNode *ctroot,BTreeNode *btroot)//树转化为二叉树ctroot指向树的根节点,btroot,指向二叉树的跟
{
QueueCTree *VisitedCTreeNodes;
QueueBTree *VisitedBTreeNodes;//辅助队列
initQueueCTree(VisitedCTreeNodes);
initQueueBTree(VisitedBTreeNodes);//初始化队列
CTreeNode *ctnode;
BTreeNode *btnode,*p,*LastSibling;
int i;
btroot=(BTreeNode *)malloc(sizeof(BTreeNode));//添加开辟内存空间语句
btroot-data=ctroot-data;//树的根节点作为二叉树的根节点
btroot-lchild=btroot-rchild=NULL;
addQueueCTree(VisitedCTreeNodes,ctroot);//树的跟节点入队
addQueueBTree(VisitedBTreeNodes,btroot);//二叉树的跟节点入队
while(!QueueCTreeEmpty(VisitedCTreeNodes))
{
ctnode=delQueueCTree(VisitedCTreeNodes);//树节点出队
btnode=delQueueBTree(VisitedBTreeNodes);//二叉树节点出队
for(i=0;iDEGREE;i++)//访问节点所有的孩子节点
{
if(ctnode-children[i]==NULL)//孩子节点访问完毕
break;
p=(BTreeNode *)malloc(sizeof(BTreeNode));//分配二叉树节点
p-data=ctnode-children[i]-data;
p-lchild=p-rchild=NULL;
if(i==0)
btnode-lchild=p;//长子,作为父节点的做孩子
else
LastSibling-rchild=p;//作为上一个兄弟节点的右孩子
LastSibling=p;
addQueueCTree(VisitedCTreeNodes,ctnode-children[i]);//树节点进队列
addQueueBTree(VisitedBTreeNodes,p);//二叉树节点进门队列
}
}
}
/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@二叉树的遍历@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
void Preorder(BTreeNode *T)
{
if(T)
{
printf("%2c",T-data);
Preorder(T-lchild);
Preorder(T-rchild);
}
}
/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@主函数调用@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
int main()
{
CTreeNode *Tree;
BTreeNode *BTree;
printf("创建一棵树\n");
Tree=CreateSTree();
printf("树的先序遍历结果为:");
preorderTree(Tree);
printf("\n");
TreeToBTree(Tree,BTree);
printf("转换后的二叉树,先序遍历的结果为:");
Preorder(BTree);
printf("\n");
return 0;
}
数据结构创建一棵树的c语言代码怎么写?
刚刚回答了一个类似的问题,以下代码供参考:
#include "stdio.h"
#include "stdlib.h"
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef char TElemType;
typedef int Status;
typedef struct BiTNode { // 结点结构
TElemType data;
struct BiTNode *lchild, *rchild;
// 左右孩子指针
} BiTNode, *BiTree;
//以下是建立二叉树存储结构,空节点输入作为#结束标识
Status CreateBiTree(BiTree T) {
//请将该算法补充完整,参见第6章课件算法或课本
char ch;
scanf("%c",ch);
if(ch=='#') T=NULL;
else{
if(!(T=(BiTNode*)malloc(sizeof(BiTNode))))
exit(OVERFLOW);
T-data=ch;
CreateBiTree(T-lchild);
CreateBiTree(T-rchild);
}
return OK;
} // CreateBiTree
void Preorder(BiTree T)
{
if(T)
{
printf("%c",T-data);
Preorder(T-lchild);
Preorder(T-rchild);
}
}
void Inorder(BiTree T)
{ // 中序遍历二叉树
//请将该算法补充完整,参见第6章课件算法
if(T)
{
Inorder(T-lchild);
printf("%c",T-data);
Inorder(T-rchild);
}
}
void Postorder(BiTree T)
{ // 后序遍历二叉树
//请将该算法补充完整,参见第6章课件算法
if(T)
{
Postorder(T-lchild);
Postorder(T-rchild);
printf("%c",T-data);
}
}
//以下是求叶子结点数
void CountLeaf(BiTree T,int count){
//请将该算法补充完整,参见第6章课件算法
if(T){
if((!T-lchild)(!T-rchild))
count++;
CountLeaf(T-lchild,count);
CountLeaf(T-rchild,count);
}
}
//以下是求二叉树的深度
int Depth(BiTree T ){
//请将该算法补充完整,参见第6章课件算法
int depthval,depthLeft,depthRight;
if(!T) depthval=0;
else{
depthLeft = Depth(T-lchild);
depthRight = Depth(T-rchild);
if(depthLeftdepthRight)depthval = 1+depthLeft;
else depthval = 1+depthRight;
}
return depthval;
}
void main(){
BiTree T;
int s=0,d;
printf("\n creat of the bitree:\n");
CreateBiTree(T);
printf("\n output result of Preorder:\n");
Preorder(T);
CountLeaf(T,s);
d=Depth(T);
printf("\n leaves=%d\n",s);
printf("\n depth=%d\n",d);
}
数据结构二叉树的程序,用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语言写二叉树,源代码。
二叉树是采用递归定义的,实现起来代码简洁(也许并不简单)。并且它在具体的计算机科学中有很重要的运用,是一种很重要的数据结构,二叉树有三种遍历和建立的方式。今天先学习一下它的建立和打印。
以下代码在Win-Tc1.9.1下编译通过。
#include stdio.h
#define ElemType char
//节点声明,数据域、左孩子指针、右孩子指针
typedef struct BiTNode{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
//先序建立二叉树
BiTree CreateBiTree(){
char ch;
BiTree T;
scanf("%c",ch);
if(ch=='#')T=NULL;
else{
T = (BiTree)malloc(sizeof(BiTNode));
T-data = ch;
T-lchild = CreateBiTree();
T-rchild = CreateBiTree();
}
return T;//返回根节点
}
//先序遍历二叉树
void PreOrderTraverse(BiTree T){
if(T){
printf("%c",T-data);
PreOrderTraverse(T-lchild);
PreOrderTraverse(T-rchild);
}
}
//中序遍历
void InOrderTraverse(BiTree T){
if(T){
PreOrderTraverse(T-lchild);
printf("%c",T-data);
PreOrderTraverse(T-rchild);
}
}
//后序遍历
void PostOrderTraverse(BiTree T){
if(T){
PreOrderTraverse(T-lchild);
PreOrderTraverse(T-rchild);
printf("%c",T-data);
}
}
void main(){
BiTree T;
T = CreateBiTree();//建立
PreOrderTraverse(T);//输出
getch();
}
C语言树的代码,谁有啊?就是InitTree(&T)什么的,包括插入子树,返回某个节点子树,越全越好!
#include stdio.h
#include stdlib.h
typedef int DataType;
typedef struct BTree{
DataType data;
struct BTree *Tleft;
struct BTree *Tright;
}*BTree;
BTree CreateTree(); //建树
BTree insert(BTree root, DataType data);//插入节点
void InBTree(BTree root); //中序遍历
void PreBTree(BTree root); //先序遍历
void PostBTree(BTree root);//后序遍历
BTree findPostion(BTree root, int deleteNode, int *flags);//寻找合适的插入点
BTree delNode(BTree root, BTree parent, int flags); //删除树节点
int main(){
BTree root = NULL;
int flags = 0;
int deleteNode = 0;
BTree parent = NULL;//所删除节点的父节点
char choiceAgain = 'Y';
root = CreateTree();
printf("\n中序遍历: ");
InBTree(root);
printf("\n前序遍历: ");
PreBTree(root);
printf("\n后序遍历: ");
PostBTree(root);
printf("\n");
do{
printf("需要删掉的节点: ");
scanf("%d", deleteNode);
parent = findPostion(root, deleteNode, flags);
root = delNode(root, parent, flags);
printf("删除后的结果: ");
printf("\n中序遍历: ");
InBTree(root);
printf("\n前序遍历: ");
PreBTree(root);
printf("\n后序遍历: ");
PostBTree(root);
choiceAgain = 'N';
printf("\nDelete Again(Y) or N?: ");
getchar();
scanf("%c", choiceAgain);
}while(choiceAgain == 'Y' || choiceAgain == 'y');
printf("\nDone!\n");
return 0;
}
BTree CreateTree(){
BTree root = NULL;
DataType temp = 0;
printf("请输入节点,以0结尾:\n");
scanf("%d", temp);
while(temp != 0){
root = insert(root, temp);
scanf("%d", temp);
}
return root;
}
BTree insert(BTree root, DataType data){
BTree ptr = root;
BTree tempNode;
BTree newNode = (BTree)malloc(sizeof(struct BTree));
newNode-data = data ;
newNode-Tleft = NULL;
newNode-Tright = NULL;
if(ptr == NULL){
return newNode;
}else{
while(ptr != NULL){
tempNode = ptr;
if(ptr-data = data){
ptr = ptr-Tleft;
}else{
ptr = ptr-Tright;
}
}
if(tempNode-data = data){
tempNode-Tleft = newNode;
}else{
tempNode-Tright = newNode;
}
}
return root;
}
BTree findPostion(BTree root, int deleteNode, int *flags){
BTree parentNode = root;
BTree temp = root;
*flags = 0;
while(temp != NULL){
if(temp-data == deleteNode){
return parentNode;
}else{
parentNode = temp;
if(temp-data deleteNode){
temp = temp-Tleft;
*flags = -1;
}else{
temp = temp-Tright;
*flags = 1;
}
}
}
return NULL;
}
BTree delNode(BTree root, BTree parent, int flags){
BTree deleteNode = NULL;
if(parent == NULL){
printf("未找到删除的节点!\n");
return root;
}
switch(flags){
case -1:
deleteNode = parent-Tleft;
break;
case 0:
deleteNode = parent;
break;
case 1:
deleteNode = parent-Tright;
break;
default:
printf("ERROR!\n");
exit(1);
}
if(deleteNode-Tleft == NULL deleteNode-Tright == NULL){
if(parent-Tleft == deleteNode){
parent-Tleft = NULL;
}else if(parent-Tright == deleteNode){
parent-Tright = NULL;
}else{
parent = NULL;
}
free(deleteNode);
}else if(deleteNode-Tleft == NULL deleteNode-Tright != NULL){
if(deleteNode-data == root-data){
root = deleteNode-Tright;
}else{
if(parent-Tleft-data == deleteNode-data){
parent-Tleft = deleteNode-Tright;
}else{
parent-Tright = deleteNode-Tright;
}
}
free(deleteNode);
}else if(deleteNode-Tleft != NULL deleteNode-Tright == NULL){
if(deleteNode-data == root-data){
root = deleteNode-Tleft;
}else{
if(parent-Tleft-data == deleteNode-data){
parent-Tleft = deleteNode-Tleft;
}else{
parent-Tright = deleteNode-Tleft;
}
}
free(deleteNode);
}else{
BTree temp = deleteNode-Tleft;
BTree tempParent = deleteNode;
while(temp-Tright != NULL){
tempParent = temp;
temp = temp-Tright;
}
deleteNode-data = temp-data;
if(tempParent-Tleft == temp){
tempParent-Tleft = temp-Tleft;
}else{
tempParent-Tright = temp-Tleft;
}
printf("temp = %d\n", temp-data);
free(temp);
}
return root;
}
void InBTree(BTree root){
if(root != NULL){
InBTree(root-Tleft);
printf("%d ", root-data);
InBTree(root-Tright);
}
}
void PreBTree(BTree root){
if(root != NULL){
printf("%d ", root-data);
PreBTree(root-Tleft);
PreBTree(root-Tright);
}
}
void PostBTree(BTree root){
if(root != NULL){
PostBTree(root-Tleft);
PostBTree(root-Tright);
printf("%d ", root-data);
}
}
抱歉,这是二叉树的代码。刚刚没看清你的要求。不过先把这个给你参考吧。树的代码现在没有时间弄。
求数据结构(C语言版)建立二叉树的代码~~急~~谢谢了
BT.H文件
#include
stdio.h
#include
malloc.h
#include
conio.h
#define
TRUE
1
#define
FALSE
#define
ERROR
#define
OK
1
#define
Stack_Size
50
#define
NUM
50
#define
MAXSIZE
50
//队列的最大长度
//定义二叉树
typedef
char
DataType;
typedef
struct
Node
{
DataType
data;
struct
Node
*LChild;
struct
Node
*RChild;
}BiTNode,
*BiTree;
//定义stack
typedef
BiTree
StackElementType;
typedef
struct
{
StackElementType
elem[Stack_Size];
int
top;
}SeqStack;
//定义队列
typedef
BiTree
QueueElementType;
typedef
struct
{
QueueElementType
element[MAXSIZE];
int
front;
int
rear;
}SeqQueue;
//队列的抽象
void
InitQueue(SeqQueue
*Q)
{
Q-front=Q-rear=0;
}
int
EnterQueue(SeqQueue
*Q,
QueueElementType
x)
{
if((Q-rear+1)%MAXSIZE==Q-front)
return(FALSE);
Q-element[Q-rear]=x;
Q-rear=(Q-rear+1)%MAXSIZE;
return(TRUE);
}
关于c树形结构源代码和c语言 树结构的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
版权说明:如非注明,本站文章均为 AH站长 原创,转载请注明出处和附带本文链接;
相关推荐
- 05-12网页设计需要学什么,网页设计学什么语言
- 05-07pb超级报表源代码(pb报表工具)[20240507更新]
- 05-07简历源代码可以上传照片的简单介绍[20240507更新]
- 05-07广告切换源代码免费下载(广告切换源代码免费下载安装)[20240507更新]
- 05-06阁楼网源代码(阁楼是什么网站)[20240506更新]
- 05-06源代码管理资源管理器(资源管理器运行代码)[20240506更新]
- 05-06人脸识别源代码pdf的简单介绍[20240506更新]
- 05-06包含超市管理系统java源代码的词条[20240506更新]
- 05-06商城app源代码免费(商城App源码)[20240506更新]
- 05-06包含游戏源代码不同的模式的词条[20240506更新]
取消回复欢迎 你 发表评论:
- 标签列表
- 最近发表
- 友情链接