线索化二叉树(代码 、分析 、汇编)

代码:

BTree.h
BTree.c
二叉树(多路平衡搜索树)

SeqList.h
SeqList.c
顺序表

main.c

#include <stdio.h>
#include <stdlib.h>
#include "BTree.h"
#include "SeqList.h"


struct Node//树节点
{
    
    
    BTreeNode header;
    char v;
};

void printf_data(BTreeNode* node)
{
    
    
    if( node != NULL )
    {
    
    
        printf("%c", ((struct Node*)node)->v);
    }
}
//定义将树的所有节点设置成可以向左一直访问节点
//只是从左开始向右,依次将未尾节点的在子节点指向另一个节点,实现可以向左一直访问
//并不是将整个树结构改变
void thread_via_left(BTreeNode* root, BTreeNode** pp)
{
    
    
    //节点不为空与节点指针不为空
	//注意:这里其实第一次后只会判断第一个条件,因为pp一直有指向节点指针变量,只是指向的
	 //节点指针变量指向的节点会为空。这是在里面判断
    if( (root != NULL) && (pp != NULL) )
    {
    
    
        if( *pp != NULL )//当前这个节点指针不为空
        {
    
    
            (*pp)->left = root;//将这个指针指向的节点指针的节点的左子节点设为当前传来的节点
            *pp = NULL;//当前这个指针指向的节点指针的节点的左子节点已经有指向,将这个指针设空,不再指向这个节点
        }
        
        if( root->left == NULL )//如果传来的节点的左子节点为空
        {
    
    
            *pp = root;//将指向节点指针指向的节点等于传来的节点,表示下次传来的节点将作为这个节点的左子节点
        }
        
        thread_via_left(root->left, pp);
        thread_via_left(root->right, pp);
    }
}

void thread_via_list(BTreeNode* root, SeqList* list)//将树子节点全部插入顺序表
{
    
    
    if( (root != NULL) && (list != NULL) )
    {
    
    
        SeqList_Insert(list, (SeqListNode*)root, SeqList_Length(list));
        
        thread_via_list(root->left, list);
        thread_via_list(root->right, list);
    }
}

int main(int argc, char *argv[])
{
    
    
    BTree* tree = BTree_Create();//创建一个树
    BTreeNode* current = NULL;
    BTreeNode* p = NULL;
    SeqList* list = NULL;//顺序表指针
    int i = 0;
    
    struct Node n1 = {
    
    {
    
    NULL, NULL}, 'A'};
    struct Node n2 = {
    
    {
    
    NULL, NULL}, 'B'};
    struct Node n3 = {
    
    {
    
    NULL, NULL}, 'C'};
    struct Node n4 = {
    
    {
    
    NULL, NULL}, 'D'};
    struct Node n5 = {
    
    {
    
    NULL, NULL}, 'E'};
    struct Node n6 = {
    
    {
    
    NULL, NULL}, 'F'};
    
    BTree_Insert(tree, (BTreeNode*)&n1, 0, 0, 0);
    BTree_Insert(tree, (BTreeNode*)&n2, 0x00, 1, 0);
    BTree_Insert(tree, (BTreeNode*)&n3, 0x01, 1, 0);
    BTree_Insert(tree, (BTreeNode*)&n4, 0x00, 2, 0);
    BTree_Insert(tree, (BTreeNode*)&n5, 0x02, 2, 0);
    BTree_Insert(tree, (BTreeNode*)&n6, 0x02, 3, 0);
    
    printf("Full Tree: \n");
    
    BTree_Display(tree, printf_data, 4, '-');
    
    printf("Thread via List:\n");
    
    list = SeqList_Create(BTree_Count(tree));//创建顺序表容量是树的节点数量
    
    thread_via_list(BTree_Root(tree), list);//调用函数将树节点插入到表中
    
    for(i=0; i<SeqList_Length(list); i++)
    {
    
    
        printf("%c, ", ((struct Node*)SeqList_Get(list, i))->v);
		//输出:ABDEFC
    }
    
    printf("\n");
    
    printf("Thread via Left:\n");
    
    current = BTree_Root(tree);//取得根节点
    
    thread_via_left(current, &p);
    
    while( current != NULL )
    {
    
    
        printf("%c, ", ((struct Node*)current)->v);
        
        current = current->left;
		//输出:ABDEFC
    }
    
    printf("\n");
    
    BTree_Destroy(tree);
	getchar();
	return 0;
}


分析:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

汇编:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_37599645/article/details/112071888