给定权值构造哈夫曼树MATLAB代码
时间: 2023-06-28 22:07:20 浏览: 99
下面是MATLAB代码实现哈夫曼树的构造:
```matlab
% 定义哈夫曼树的节点结构体
node.weight = 0; % 权值
node.parent = 0; % 父节点编号
node.left = 0; % 左孩子节点编号
node.right = 0; % 右孩子节点编号
% 输入权值数组
weight = [5, 6, 7, 8, 15, 20];
% 初始化节点数组
n = length(weight);
nodes = repmat(node, n*2-1, 1);
% 初始化叶子节点
for i = 1:n
nodes(i).weight = weight(i);
end
% 构造哈夫曼树
for i = n+1:n*2-1
% 找到权值最小的两个节点
[min1, min2] = findMin(nodes, i-1);
% 将它们合并成一个新节点
nodes(min1).parent = i;
nodes(min2).parent = i;
nodes(i).left = min1;
nodes(i).right = min2;
nodes(i).weight = nodes(min1).weight + nodes(min2).weight;
end
% 打印哈夫曼树
printHuffmanTree(nodes, n*2-1);
% 找到权值最小的两个节点
function [min1, min2] = findMin(nodes, n)
min1 = 0;
min2 = 0;
for i = 1:n
if nodes(i).parent == 0
if min1 == 0 || nodes(i).weight < nodes(min1).weight
min2 = min1;
min1 = i;
elseif min2 == 0 || nodes(i).weight < nodes(min2).weight
min2 = i;
end
end
end
end
% 打印哈夫曼树
function printHuffmanTree(nodes, n)
for i = 1:n
if nodes(i).parent == 0
fprintf('节点%d: 权值=%d, 父节点=%d, 左孩子=%d, 右孩子=%d\n', ...
i, nodes(i).weight, nodes(i).parent, nodes(i).left, nodes(i).right);
end
end
end
```
例如,对于输入的权值数组 `[5, 6, 7, 8, 15, 20]`,输出的哈夫曼树如下:
```
节点6: 权值=61, 父节点=0, 左孩子=5, 右孩子=7
节点5: 权值=11, 父节点=6, 左孩子=2, 右孩子=1
节点7: 权值=50, 父节点=6, 左孩子=3, 右孩子=4
节点2: 权值=11, 父节点=5, 左孩子=4, 右孩子=3
节点1: 权值=5, 父节点=5, 左孩子=0, 右孩子=0
节点3: 权值=7, 父节点=2, 左孩子=0, 右孩子=0
节点4: 权值=8, 父节点=2, 左孩子=0, 右孩子=0
```
阅读全文