线索二叉树
定义
二叉树虽然是非线性结构,但二叉树的遍历却为二叉树的结点集导出了一个线性序列因而,二叉树的结点存在关于这个线性序列的前驱和后继。对应于前序、中序、后序遍历,除了相应序列的第一个和最后一个,二又树的每个结点都存在前序前驱/后继、中序前驱/后继、后序前驱/后继。
利用上述几种遍历方式对二叉树进行遍历后,可将树中所有结点都按照某种次序排列在一个线性有序(前序、中序和后序)的序列中。这样,从某个结点出发可以很容易地找到它在某种次序下的前驱和后继。
指示前驱与后继的指针叫做“线索”,加上了线索的二叉树叫做线索二叉树。对应二叉链表叫做线索二叉链表。在线索二叉树中,由于有了线索,无需遍历二叉树就可得到任一结点的前驱与后继结点的地址。
struct ThreadTreeNode {
int val, ltag, rtag;
ThreadTreeNode *left;
ThreadTreeNode *right;
ThreadTreeNode() : val(0), left(nullptr), right(nullptr), ltag(0), rtag(0) {}
ThreadTreeNode(int x) : val(x), left(nullptr), right(nullptr), ltag(0), rtag(0) {}
ThreadTreeNode(int x, ThreadTreeNode *left, ThreadTreeNode *right) : val(x), left(left), right(right), ltag(0), rtag(0) {}
};
中序线索二叉树的建立
利用中序遍历线索化二叉树:
ThreadTreeNode* pre = new ThreadTreeNode();
void CreatThread(ThreadTreeNode* root, ThreadTreeNode* pre){
if(root == nullptr){
return;
}
CreatThread(root -> left, pre);
if(!root -> left){
root -> left = pre;
root -> ltag = 1;
}
if(pre && !root -> right){
pre -> right = root;
pre -> rtag = 1;
}
pre = root;
CreatThread(root -> right, pre);
}
pre -> right = nullptr;
pre -> rtag = 1;



