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计算过程:
哈夫曼树构造过程:
或总结为,从最小元素作为左右元素,根为两元素之和,依次将元素放置于树中。
图示如下:
下图为构造最优树方法简介:
***存疑:未能理解书中代码,无法实现算法构造哈夫曼树。