数据结构 – 树的度和结点数的关系

1: 二叉树叶子节点与度为二的节点有什么关系?

叶子结点就是没有孩子的结点,其度为0,度为二的结点是指有两个子数的结点。比如一棵完全二叉树有三层,叶子结点就是最下面那一层的结点数,没有孩子结点,就是4,度为二的结点有3个。

一、概念

与图论中的“度”不同,树的度是如下定义的:有根树T中,结点x的子女数目称为x的度。也就是:在树中,结点有几个分叉,度就是几。
一个有用的小公式:树中结点数 = 总分叉数 +1。(这里的分叉数就是所有结点的度之和)

二、度的计算

1.设树T的度为4,其中度为1,2,3,4的节点个数分别为4,2,1,1,则T中的叶子数为?
解:
叶子的度数为0;那么设叶子数为x,则此树的总分叉数为1*4+2*2+3*1+4*1=15;此树的节点个数为16(此处涉及到一个公式;节点 数=分叉数+1,由图形便可以观察出来)。又根据题目可以知道顶点数目还可以列出一个式子:4+2+1+1+x便可以得到等 式:4+2+1+1+x=16;x=8为叶子数。
因为此题是数据结构中的问题:一般情况下都是有向树,所以叶子节点的度数为0,要区分于离散数学中的无向树叶子节点度为一。在数据结构中一般常用的 公式为:二叉树:度为0的节点数=度为2的节点数+1(n0=n2+1)此公式可由上述计算思想推导(一般在二叉树那里的公式多一些,树中只要你明确定 义,画出图来,便可以根据图形寻找出规律来)
==================

一棵无向树T有3个2度结点,2个3度结点,2个4度结点,其余为叶。则T共有多少个结点,多少片叶?

解答:一共是21个结点,叶子结点为14个,简单的方法是你随意照着条件画一个就行,要算也简单,叶子结点=3*2+2*3+2*4-3-2-2+1=14,也就是等于总度数-节点数+1

按理不是说先设树总结点数为N,然后3x2+2x3+2x4+(N-2-3-4)x1=(N-1)x2 这样解出来的N为13 总结点

好的,以下是建立哈夫曼并输出C语言数据结构的代码: ```c #include <stdio.h> #include <stdlib.h> #define MAX_LEAF_NODE 1000 // 定义哈夫曼结点 typedef struct Node { int weight; // 权值 int parent; // 父亲结点编号 int leftChild; // 左儿子结点编号 int rightChild; // 右儿子结点编号 } Node; // 建立哈夫曼 void buildHuffmanTree(Node huffmanTree[], int leafWeight[], int n) { // 初始化叶子结点 int i; for (i = 0; i < n; i++) { huffmanTree[i].weight = leafWeight[i]; huffmanTree[i].parent = -1; huffmanTree[i].leftChild = -1; huffmanTree[i].rightChild = -1; } // 建立中间结点 for (; i < 2 * n - 1; i++) { int min1 = -1, min2 = -1; // 找出权值最小的两个结点 int j; for (j = 0; j < i; j++) { if (huffmanTree[j].parent == -1) { // 未被处理的结点 if (min1 == -1 || huffmanTree[j].weight < huffmanTree[min1].weight) { min2 = min1; min1 = j; } else if (min2 == -1 || huffmanTree[j].weight < huffmanTree[min2].weight) { min2 = j; } } } // 将两个权值最小的结点合并 huffmanTree[min1].parent = i; huffmanTree[min2].parent = i; huffmanTree[i].weight = huffmanTree[min1].weight + huffmanTree[min2].weight; huffmanTree[i].leftChild = min1; huffmanTree[i].rightChild = min2; } } // 输出哈夫曼的C语言数据结构 void printHuffmanTree(Node huffmanTree[], int n) { printf("Node huffmanTree[%d] = {\n", 2 * n - 1); int i; for (i = 0; i < 2 * n - 1; i++) { printf("{%d, %d, %d, %d}", huffmanTree[i].weight, huffmanTree[i].parent, huffmanTree[i].leftChild, huffmanTree[i].rightChild); if (i < 2 * n - 2) { printf(", "); } if ((i + 1) % 5 == 0) { printf("\n"); } } printf("\n};\n"); } int main() { int n; // 叶子结点 int leafWeight[MAX_LEAF_NODE]; // 叶子结点权值 Node huffmanTree[2 * MAX_LEAF_NODE - 1]; // 哈夫曼 printf("请输入叶子结点:"); scanf("%d", &n); printf("请依次输入%d个叶子结点的权值:", n); int i; for (i = 0; i < n; i++) { scanf("%d", &leafWeight[i]); } buildHuffmanTree(huffmanTree, leafWeight, n); printHuffmanTree(huffmanTree, n); return 0; } ``` 这段代码可以根据输入的叶子结点权值建立哈夫曼,并输出C语言数据结构。其中,哈夫曼结点类型为`Node`,包括权值(`weight`)、父亲结点编号(`parent`)、左儿子结点编号(`leftChild`)和右儿子结点编号(`rightChild`)四个属性。`buildHuffmanTree`函用于建立哈夫曼,`printHuffmanTree`函用于输出哈夫曼的C语言数据结构
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值