利用哈夫曼编码实现显示DOS的Tree

第一次写博客,有点小紧张

最近在上数据结构专周,实现哈夫曼的编码和译码,最后为了实现直观的显示出树,于是仿造dos的tree命令,实现了显示生成的哈夫曼

原理差不多就是树的前序遍历,每一行代表每次输出的一个节点

但是对于每个节点的输出有不同的处理方式

1.根节点直接输出

2.按照当前的层数输出"│ "或"     "

3.右孩子输出"└─"后输出节点,左孩子输出"├─"后输出节点

4.这样打印出来的树有多余的"│ "


扫描二维码关注公众号,回复: 1808077 查看本文章
//显示生成的哈夫曼树
//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]--;
                }
            }
        }
    }
} 

猜你喜欢

转载自blog.csdn.net/t_null/article/details/42168873