标签:中序 child 长度 线索二叉树 总结 data 算法 哈夫曼树 return
void PreOrder(BTNode *b)
{ if(b!=NULL)
{ printf("%c",b->data);//访问根节点
PreOrder(b->lchild);//先序遍历左子树
PreOrder(b->rchild);//先序遍历右子树
void InOrder(BTNode *b)
{ if(b!=NULL)
{ InOrder(b->lchild);
printf("%c",b->data);
InOrder(b->rchild);
void PostOrder(BTNode *b)
{ if(b!=NULL)
{ PostOrder(b->lchild);
PostOrder(b->rchild);
printf("%c",b->data);
如图所示二叉树三种遍历结果如下:
线索二叉树中,每个结点的储存结构如下图:
中序线索化二叉树的算法如下:
TBTNode* pre;
void Thread(TBTNode*& p) //对二叉树p进行中序线索化
{
if (p != NULL)
{
Thread(p->lchild); //左子树线索化
if (p->lchild == NULL)//左孩子不存在则进行前驱结点线索化
{
p->lchild = pre; //建立前驱结点的后继结点线索
p->ltag = 1
}
else //p结点左子树已线索化
p->ltag = 0;
if (pre->rchild == NULL)//对pre的后继结点线索化
{
pre->rchild = p; //建立前驱结点的后继结点线索
pre->lchild = 1;
}
else
pre->rtag = 0;
pre = p;
Thread(p->rchild); //右子树线索化
}
}
TBTNode* CreateThread(TBTNode* b)//右子树线索化
{
TBTNode * root;
root = (TBTNode*)malloc(sizeof(TBTNode));
root->ltag = 0;
root->rtag = 1;
root->rchild = b;
if (b == NULL)
root->lchild = root;
else
{
root->lchild = b;
pre = root; //pre是结点p的前驱结点,供加线索用
Thread(b);
pre->rchild = root; //加入指向头结点的线索
pre->rtag = 1;
root->rchild = pre; //头结点有线索化
}
return root;
}
下图为WPL计算过程:
哈夫曼树构造过程:
或总结为,从最小元素作为左右元素,根为两元素之和,依次将元素放置于树中。
图示如下:
下图为构造最优树方法简介:
***存疑:未能理解书中代码,无法实现算法构造哈夫曼树。
标签:中序 child 长度 线索二叉树 总结 data 算法 哈夫曼树 return
原文地址:https://www.cnblogs.com/11--1/p/14723008.html