/*中序线索二叉树*/
#include <iostream>
using namespace std;
typedef char ElemType;
struct TTreeNode
{
ElemType data;
TTreeNode *left;
TTreeNode *right;
int ltag;
int rtag;
};
//对二叉树进行中序线索化即建立中序线索
void InThread(TTreeNode *HT)
{
static TTreeNode *pre = NULL; //指向前驱结点,用以保存刚访问过的结点指针
if(HT != NULL)
{
if(HT->ltag == 0)
InThread(HT->left); //当左子树非空时,给左子树加中序线索
if(pre != NULL && pre->rtag == 1)
pre->right = HT; //给前驱结点加后继线索
if(HT->left == NULL)
{
//给当前结点加前驱线索
HT->ltag = 1;
HT->left = pre;
}
if(HT->right == NULL)
HT->rtag = 1; //给右指针域为空的结点加右线索标记
pre = HT; //把刚访问过的当前结点置为前驱结点
if(HT->rtag == 0)
InThread(HT->right); //当右子树非空时,给右子树加中序线索
}
}
//在中序线索二叉树上求结点p的中序后继结点
TTreeNode* InOrderNext(TTreeNode *p)
{
if(p->rtag == 1)
return p->right;
p = p->right;
while(p->ltag == 0)
p->left;
return p;
}
//线索二叉树的中序遍历
void ThInOrder(TTreeNode *HT)
{
if(HT != NULL)
{
while(HT->ltag == 0)
HT = HT->left;
do
{
cout<<HT->data<<" ";
HT = InOrderNext(HT);
}
while(HT != NULL);
}
}
中序线索二叉树
最新推荐文章于 2024-07-29 08:47:18 发布