- 线索二叉树结构
lChild | lTag | data | rTag | rChild |
---|
lTag:0左孩子,1前驱
rTag:0右孩子,1后继
//代码结构
typedef struct ThreadNode {
ElemType data;
ThreadNode *lChild, *rChild;
int lTag, rTag;
} ThreadNode, *ThreadTree;
- 中序构造线索二叉树
按照中序遍历,初始化pre = NULL
,pre指向上一个访问的结点,p指向当前访问的结点。
若p左指针为NULL
,则 p->lChild = pre
;
若pre的右指针为NULL
,则 pre->rChild = p
。
//中序构造线索二叉树
typedef struct ThreadNode {
ElemType data;
ThreadNode *lChild, *rChild;
int lTag, rTag;
} ThreadNode, *ThreadTree;
void CreateInThread(ThreadTree tree) {
ThreadTree pre;
if (tree != NULL) {
InThread(tree, pre);
pre->rChild = NULL;
pre->rTag = 1;
}
}
void InThread(ThreadTree &p, ThreadTree &pre) {
if (p != NULL) {
InThread(p->lChild, pre);//①
//=========>>>
if (p->lChild == NULL) {
p->lChild = pre;
p->lTag = 1;
}
if (pre->rChild == NULL) {
pre->rChild = p;
pre->rTag = 1;
}
pre = p;
//<<<========= ②
InThread(p->rChild, pre);//③
}
}
- 中序遍历线索二叉树
//中序遍历线索二叉树
ThreadNode *firstNode(ThreadNode *p) {
while (p->lTag == 0) p = p->lChild;
return p;
}
ThreadNode *nextNode(ThreadNode *p) {
if (p->rTag == 0) return firstNode(p->rChild);
else return p->rChild;
}
void inOrder(ThreadNode *tree) {
ThreadNode *p = firstNode(tree);
while (p != NULL) {
cout << p->data << endl;
p = nextNode(p);
}
}
- 构造:前序和后序线索二叉树
前序和后序二叉树构造只需改变位置成②①③;①③②;
- 前序和后序构造的线索二叉树的遍历?