考点
- 遍历序列中的起始为,从根一直往左走,直到不能再走,即为遍历序列的起始节点。注意: 不一定是叶子节点。
- 遍历序列的最后一个节点,从根一直往右走即可。
- 找后继节点
- 若右指针为线索,则右指针指向的即为后继
- 如果右指针不是线索,就从当前节点向右走一步,再一直向左
- 找前驱节点
- 若左指针为线索,左指针指向的节点即为前驱
- 若左指针指向的不是线索,就从当前节点向左走一步,再一直向右走
代码实现
#include <iostream>
using namespace std;
struct node{
char data;
int ltag, rtag;
struct node *lChild;
struct node *rChild;
node () {
ltag = 0;
rtag = 0;
lChild = NULL;
rChild = NULL;
}
};
node *create(node *p)
{
char c;
cin >> c;
if (c != '#')
{
p = new node;
p->data = c;
p->lChild = create(p->lChild);
p->rChild = create(p->rChild);
}
return p;
}
void mid(node *p)
{
if (p)
{
mid(p->lChild);
cout << p->data;
mid(p->rChild);
}
}
void InThread(node *p, node *&pre)
{
if (p)
{
InThread(p->lChild, pre);
if (p->lChild == NULL)
{
p->lChild = pre;
p->ltag = 1;
}
if (pre && !pre->rChild)
{
pre->rChild = p;
pre->rtag = 1;
}
pre = p;
InThread(p->rChild, pre);
}
}
node * createInThread(node *root)
{
node *pre = NULL;
if (root)
{
InThread(root, pre);
pre->rChild = NULL;
pre->rtag = 1;
}
return root;
}
node *First(node *p)
{
while (p->ltag==0)
p = p->lChild;
return p;
}
node *Next(node *p)
{
if (p->rtag == 0)
{
return First(p->rChild);
}
else
{
return p->rChild;
}
}
void Inorder(node *root)
{
for (node *p = First(root); p!= NULL; p=Next(p))
cout << p->data;
cout << endl;
}
int main()
{
struct node *root;
root = create(root);
mid(root);
cout << endl;
root = createInThread(root);
Inorder(root);
return 0;
}