Threaded binary tree (code, analysis, assembly)

table of Contents:

Code:

BTree.h
BTree.c
Binary tree (multiple balanced search tree)

SeqList.h
SeqList.c
sequence table

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;
}


analysis:

Insert picture description here
Insert picture description here
Insert picture description here
Insert picture description here
Insert picture description here
Insert picture description here
Insert picture description here
Insert picture description here
Insert picture description here

Insert picture description here

compilation:

Insert picture description here
Insert picture description here
Insert picture description here
Insert picture description here

Guess you like

Origin blog.csdn.net/m0_37599645/article/details/112071888