第一次写博客,有点小紧张
最近在上数据结构专周,实现哈夫曼的编码和译码,最后为了实现直观的显示出树,于是仿造dos的tree命令,实现了显示生成的哈夫曼
原理差不多就是树的前序遍历,每一行代表每次输出的一个节点
但是对于每个节点的输出有不同的处理方式
1.根节点直接输出
2.按照当前的层数输出"│ "或" "
3.右孩子输出"└─"后输出节点,左孩子输出"├─"后输出节点
4.这样打印出来的树有多余的"│ "
//显示生成的哈夫曼树
//huffTree:生成好的哈夫曼树
//node:当前要显示的节点
//n:当前节点的层数,是从0开始的
void PrintTree(Element* & huffTree, int node, int n)
{
if(node != -1)
{
//得到当前节点的父节点
int parent = huffTree[node].parent;
//等于0代表根节点,直接输出节点的值
if(n == 0)
{
cout<<huffTree[node].value<<endl;
PrintTree(huffTree, huffTree[node].lchild, n+1);
PrintTree(huffTree, huffTree[node].rchild, n+1);
}
else
{
for(int i = 1 ; i < n ; i++)
{
cout<<"│ ";
}
//如果是右孩子,就输出"└─"后输出节点值
if(huffTree[parent].rchild == node)
{
cout<<"└─"<<huffTree[node].value<<endl;
}
//如果是左孩子,就输出"├─"后输出节点值
else
{
cout<<"├─"<<huffTree[node].value<<endl;
}
PrintTree(huffTree, huffTree[node].lchild, n+1);
PrintTree(huffTree, huffTree[node].rchild, n+1);
}
}
}
5.于是为了处理掉多余的"│ ",发现先如果该节点是右子树,并且节点不是根节点,则该节点子树节点就不输出该层的"│ ",而用“ ”占位
由于不是该节点的子树仍可能输出"│ ",有一个返回时去掉不输出层的过程
于是就创建了一个数组num来记录不输出"│ "而用“ ”代替的节点的层数,num[0]记录个数
多了代码
for(int i = 1 ; i < n ; i++)
{
bool flag = false;
//判断第i层是否是不输出"│ "而用" "代替
for(int j = 1 ; j <= num[0] ; j++)
{
if(i == num[j])
{
cout<<" ";
flag = true;
break;
}
}
if(!flag)
{
cout<<"│ ";
}
}
和
//该节点是右孩子
if(huffTree[parent].rchild == node)
{
cout<<"└─"<<huffTree[node].value<<endl;
//该节点是内节点,不是叶子节点,用num记下层数
if(huffTree[node].rchild != -1)
{
num[++num[0]] = n;
}
}
还有
//去除掉不输出的层数
if(huffTree[parent].rchild == node)
{
if(huffTree[node].rchild != -1)
{
num[0]--;
}
}
//显示生成的哈夫曼树
//huffTree:生成好的哈夫曼树
//node:当前要显示的节点
//n:当前节点的层数,是从0开始的
//num:不需要显示"│ "的层数,num[0]储存个数
void PrintTree(Element* & huffTree, int node, int n, int num[])
{
if(node != -1)
{
//得到当前节点的父节点
int parent = huffTree[node].parent;
//等于0代表根节点,直接输出节点的值
if(n == 0)
{
cout<<huffTree[node].value<<endl;
PrintTree(huffTree, huffTree[node].lchild, n+1, num);
PrintTree(huffTree, huffTree[node].rchild, n+1, num);
}
else
{
for(int i = 1 ; i < n ; i++)
{
bool flag = false;
//判断是否有不输出"│ "的层数
for(int j = 1 ; j <= num[0] ; j++)
{
if(i == num[j])
{
cout<<" ";
flag = true;
break;
}
}
if(!flag)
{
cout<<"│ ";
}
}
//如果是右孩子,就输出
if(huffTree[parent].rchild == node)
{
cout<<"└─"<<huffTree[node].value<<endl;
//如果是右孩子且是内节点,则后面子树在该层就不输出"│ ",而用空格" "代替
//用num记下层数
if(huffTree[node].rchild != -1)
{
num[++num[0]] = n;
}
}
else
{
cout<<"├─"<<huffTree[node].value<<endl;
}
PrintTree(huffTree, huffTree[node].lchild, n+1, num);
PrintTree(huffTree, huffTree[node].rchild, n+1, num);
//去除掉不输出的层数
if(huffTree[parent].rchild == node)
{
if(huffTree[node].rchild != -1)
{
num[0]--;
}
}
}
}
}