当前位置:首页 > 代码 > 正文

c树形结构源代码(c语言 树结构)

admin 发布:2022-12-19 12:40 125


本篇文章给大家谈谈c树形结构源代码,以及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站长 原创,转载请注明出处和附带本文链接;

本文地址:http://ahzz.com.cn/post/8251.html


取消回复欢迎 发表评论:

分享到

温馨提示

下载成功了么?或者链接失效了?

联系我们反馈

立即下载