线索二叉树:
规律:在n个节点的链式二叉树中必定有n+1个空指针域
有序链式二叉树中有很多的空指针,可以让这些指针指向下一个、前一个节点,这样在遍历时可以不用递归而可以使用循环遍历,可以提高树的遍历速度
中序线索二叉树节点数据项:
数据
左子树指针
右子树指针
右子树指针标志位 (假表示指向真的右子树,真表示右子树指向下一个节点)
实现过程:
1、构建有序二叉树
2、创建线索
3、通过线索循环遍历二叉树
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
// 线索二叉树
typedef struct TreeNode
{
int data;
struct TreeNode* left;
struct TreeNode* right;
bool rflag; // 为真时右子树是线索
}TreeNode;
TreeNode* create_tree_node(int data)
{
TreeNode* node = malloc(sizeof(TreeNode));
node->data = data;
node->left = NULL;
node->right = NULL;
node->rflag = false;
return node;
}
void _insert_tree(TreeNode** root,TreeNode* node)
{
if(NULL == (*root))
{
*root = node;
return;
}
if((*root)->data > node->data)
_insert_tree(&(*root)->left,node);
else
_insert_tree(&(*root)->right,node);
}
void insert_tree(TreeNode** root,int data)
{
_insert_tree(root,create_tree_node(data));
}
void ldr_show(TreeNode* root)
{
if(NULL == root) return;
ldr_show(root->left);
printf("%d ",root->data);
ldr_show(root->right);
}
// prev永远是root的上一个节点
TreeNode* prev = NULL;
// 按中序遍历 并创建线索
void make_clue(TreeNode* root)
{
if(NULL == root) return;
make_clue(root->left);
/*
if(NULL == root->left)
{
root->left = prev;
root->lflag = true;
}
*/
if(NULL != prev && NULL == prev->right)
{
prev->right = root;
prev->rflag = true;
}
prev = root;
make_clue(root->right);
}
// 按照线索进行遍历
void clue_show_tree(TreeNode* root)
{
while(root)
{
while(root->left) root = root->left;
printf("%d ",root->data);
while(root->rflag)
{
root = root->right;
printf("%d ",root->data);
}
root = root->right;
}
}
int main(int argc,const char* argv[])
{
TreeNode* root = NULL;
for(int i=0; i<10; i++)
{
insert_tree(&root,rand()%100);
}
ldr_show(root);
make_clue(root);
printf("\nclue_show:");
clue_show_tree(root);
}