树的应用与操作

非线性结构

树定义
专业定义:1.有且只有一个成为根的节点
2.有若干个互不相交的子树,这些子树本身也是一棵树
通俗的 定义:
1.树是由节点和边组成
2.每个节点只有一个父节点但可以有多个子节点
3.但有一个节点例外,该节点没有父节点,此节点称为根节点

棵树分类
1、 树分类:
(一):一般树
任意一个节点的子节点的个数都不受限制
(二):二叉树
任意一个节点的子节点个数最多两个,且子节点的位置不可更改
分类:
一般二叉树
满二叉树
完全二叉树
(三) 森林
n个互不相交的树的集合
树的存储
2、 二叉树的存储
连续存储(完全二叉树)
优点:查找某个节点的父节点和子节点
缺点:耗用内存空间过大
链式存储
一般树的存储
双亲表示法:求父节点方便
在这里插入图片描述
孩子表示法:求子节点方便
在这里插入图片描述

双亲孩子表示法:求父节点和子节点都很方便

在这里插入图片描述
二叉树表示法
把一般树转化为二叉树来存储
具体转换方法:
设法保证任意一个节点的
左指针域指向它的第一个孩子
右指针域指向它的堂兄弟
只要能满足此条件,就可以把一个普通的树转化为二叉树
一个普通的树转化成的二叉树一定没有右子树
森林的存储
先把森林转化为二叉树,再存储二叉树
二叉树操作:
遍历
先序遍历
先序遍历
先访问根节点
中序遍历
后序遍历

应用:树是数据库中数据组织一种重要形式
操作系统子父进程的关系本身就是一颗树
面向对象语言中类的继承关系
赫夫曼树

#include<stdio.h>
#include<malloc.h>
struct BTNode 
{
    char data;		
	struct BTNode * pLchild;//p是指针L是左 child是孩子
	struct BTNode * pRchild;//p是指针r是左 child是孩子
};
void PreTraverseBTree(struct BTNode *);
struct BTNode * CreateBTree(void);
int main(void)
{
     struct BTNode * pT = CreateBTree();  
	 //对二叉树进行先序输出
	 PreTraverseBTree(pT);  	
 return 0;	
}
//静态构建二叉树 
struct BTNode * CreateBTree(void)
{
	struct BTNode * pA = (struct BTNode *)malloc(sizeof(struct BTNode));
    struct BTNode * pB = (struct BTNode *)malloc(sizeof(struct BTNode));
    struct BTNode * pC = (struct BTNode *)malloc(sizeof(struct BTNode));
    struct BTNode * pD = (struct BTNode *)malloc(sizeof(struct BTNode));
    struct BTNode * pE = (struct BTNode *)malloc(sizeof(struct BTNode));
    
	pA->data = 'A';
	pB->data = 'B'; 
    pC->data = 'C';
    pD->data = 'D';
    pE->data = 'E';
    
    pA->pLchild =pB; pB->pLchild = pB->pRchild = NULL;
    pA->pRchild =pC;
    
    pC->pLchild = pD;  pC->pRchild =NULL;
    pD->pLchild = NULL;  pD->pRchild =pE;
     
    pE->pLchild = NULL;  pE->pRchild =NULL;
    
    return pA;
}
 void PreTraverseBTree(struct BTNode * pT){
 	  if(pT!=NULL){
 	  	   //先访问根
 	  printf("%c\n",pT->data); 
 	  	//再先序访问左子树
	 PreTraverseBTree(pT->pLchild);
	 	 //再先序访问右子树 
 	 PreTraverseBTree(pT->pRchild);	
	 
	}
	
 }


 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值