第六章 树和二叉树

一、树的存储结构
双亲表示法
在这里插入图片描述

#define MaxSize 100
typedef char DataType;
typedef struct
{
DataType data;
int parent;
}PNode;
typedef struct
{
PNode tree[ MaxSize];
int treeNum;
}PTree;

孩子表示法
在这里插入图片描述

typedef char DataType;
typedef struct ChildNode
{
int child;
struct ChildNode *next}
ChildNode;
typedef struct
{ataType data;
ChildNode *first;}
TreeNode;
#define MaxSize 100typedef struct
{
TreeNode tree[Maxsize];
int treeNum;
}CTree;

二叉链表(孩子兄弟表示法
在这里插入图片描述

typedef char DataType;
typedef struct CSNode
{
DataType data;
struct CSNode *firstchild, *rightsib;
}CSNode;
CSNode *root;

二、二叉树的存储结构
顺序存储结构

#define MaxSize 100
typedef char DataType;
typedef struct
{
DataType data[MaxSize;
int biTreeNum;
}SeqBiTree;

二叉链表存储

typedef char DataType;
typedef struct BiNode
{
DataType data;
struct BiNode *lchild, *rchild;
}BiNode;
BiNode *root;

前,中,后序遍历
在这里插入图片描述
层序遍历(上下左右

void LeverOrder(BiNode *root)
BiNode*q=NULL,*Q[MaxSize];/*采用顺序队列*/
.int front = rear = -1;/*初始化顺序队列*/
if (root ==NULL) return;/*二叉树为空,算法结束*/
Q[++rear] =root;/*根指针入队*/
while (front != rear)/*当队列非空时*/
{
q=Q[++front];/*出队*/
printf("%c ", q->data);/*访问结点,为char型*/
if (q->lchild != NULL) Q[++rear]=q->lchild;
if(q->rchild != NULL) Q[++rear]=q->rchild;
}

建立二叉树

BiNode * CreatBiTree(BiNode *root){
char ch;cin >>ch;/*输入结点的数据信息*
if(ch —= '#') root= NULL;/*递归结束,建立一棵空树*/
else {
root = (BiNode *)malloc(sizeof(BiNode));root->data = ch;
root->lchild = CreatBiTree (root->lchild);/*递归建立左子树*/
root->rchild =CreatBiTree (root->rchild);/*递归建立右子树*/
}
return root;}

销毁二叉树

void DestroyBiTree(BiNode *root)1
if (root == NULL) return;else{
DestroyBiTree(root->lchild);
DestroyBiTree(root->rchild);
free(root);
}
}

三、最优二叉树

哈夫曼树的存储

typedef struct
{
int weight;/*假定权值为整数*/
int parent, lchild, rchild;
}ElemType;

哈夫曼算法

void HuffimanTree(element huffTree[ ], int w[ ], int n){
int i, k,i1, i2;
for (i =0; i<2*n-1; i++)
/*初始化,所有结点均没有双亲和孩子*/
{
huffTree[i].parent=-1; huffTree[i].lchild =-1; huffTree[i].rchild =1;}
for (i= 0; i<n; i++)
/*构造n棵只含有根结点的二叉树*/
huffTree[i].weight= w[i;
for (k = n; k<2*n-1;k++)/*n-1次合并*/
{
Select(huffTree,i1, i2);/*权值最小的两个根结点下标为il和i2*/
huffTree[k].weight = huffTree[il].weight + huffTree[i2].weight;
huffTree[i1].parent = k; huffTree[i2].parent= k;
huffTree[k ].lchild =il; huffTree[k].rchild = i2;}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 什么是二叉树二叉树是一种形数据结构,其中每个节点最多有两个子节点,分别称为左子节点和右子节点。 2. 什么是二叉搜索? 二叉搜索是一种特殊的二叉树,其中左子节点的值小于等于父节点的值,右子节点的值大于等于父节点的值。 3. 什么是完全二叉树? 完全二叉树是一种特殊的二叉树,除了最后一层外,每一层都必须填满,且最后一层从左到右依次填入节点。 4. 什么是平衡二叉树? 平衡二叉树是一种特殊的二叉搜索,其左右子高度差不超过1。 5. 什么是二叉树的遍历? 二叉树的遍历是指按照某种顺序依次访问二叉树中的每个节点,常见的遍历方式包括前序遍历、中序遍历和后序遍历。 6. 什么是二叉树的前序遍历? 二叉树的前序遍历是指按照根节点、左子、右子的顺序依次访问二叉树中的每个节点。 7. 什么是二叉树的中序遍历? 二叉树的中序遍历是指按照左子、根节点、右子的顺序依次访问二叉树中的每个节点。 8. 什么是二叉树的后序遍历? 二叉树的后序遍历是指按照左子、右子、根节点的顺序依次访问二叉树中的每个节点。 9. 什么是二叉树的层序遍历? 二叉树的层序遍历是指按照从上到下、从左到右的顺序依次访问二叉树中的每个节点。 10. 如何判断一个二叉树是否为二叉搜索? 可以通过中序遍历得到二叉树中所有节点的值,然后判断这些值是否按照升序排列即可判断是否为二叉搜索

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值