线索二叉树
线索二叉树是一种特殊的树状数据结构。实际上就是对寻常的二叉树进行了“线索化”。顾名思义,在线索化后,普通的二叉树变成了“线”,实际上,可以理解为变成了双向链表。
线索二叉树的线索化分为中序线索化,前序线索化,后序线索化。
这里只介绍中序线索化。
“A binary tree is threaded by making all right child pointers that would normally be null point to the inorder successor of the node (if it exists), and all left child pointers that would normally be null point to the inorder predecessor of the node.“
这一段的意思可以简单理解为如下内容:
1.普通二叉树中有太多的空指针(NULL),这里将其利用起来,变为”线索“
2.如果一个节点v没有左儿子,那么左儿子指针域指向中序遍历过程中v的前驱。
3.如果一个节点v没有右儿子,那么右儿子指针域指向中序遍历过程中v的后继。
4.为了区别线索与普通的左儿子右儿子指针,结构体中创建两个bool值变量left_thread,right_thread标记是否为线索。
#ifndef _THREADBINTREE_H
#define _THREADBINTREE_H
//线索二叉树,减少空链,线性中序遍历
typedef char DataType;
typedef struct thread_node{
bool left_thread,right_thread;//标注线索的flag
struct thread_node *left_child,*right_child;
DataType data;
}ThreadNode,*ThreadTree;
void CreatTree(ThreadTree & thrt);//创建线索二叉树
void CreatRoot(ThreadTree & root,ThreadTree & thrt);
void Threading(ThreadTree & thrt);//将一棵二叉树中序遍历线索化
void TraverseThreadTree(ThreadTree thrt);//非递归的遍历线索二叉树
void visit(ThreadTree node);//打印节点信息
#endif // _THREADBINTREE_H
这里我采取的方法是先构造一棵二叉树,之后对其线索化。
void CreatTree(ThreadTree & thrt)//创建线索二叉树
{
DataType data;
thrt = (ThreadTree)malloc(sizeof(ThreadNode));
if(