c语言代码实现——查找二叉树

主函数main.c 

#include "search_tree.h"

int main(int argc, char const *argv[])
{
    uint keys[] = {10, 9, 4, 6, 14, 15, 20};
    pNode root = create_tree(keys, sizeof(keys)/sizeof(uint));

    pre_order_display(root);
    mid_order_display(root);
    back_order_display(root);

    insert_node(root, create_node(12));

    pre_order_display(root);
    mid_order_display(root);
    back_order_display(root);

    pNode node = search_node(root, 14);
    root = delete_node_in_tree(root, node);

    pre_order_display(root);
    mid_order_display(root);
    back_order_display(root);
    
    return 0;
}

 

search_tree.h 

// 查找树 又名 搜索树 排序树
/* 
    规则:
    1、每个节点包含一个查找值key 
    2、生成树的过程,查找值小于根的查找值的,应当放在左子树,反之,右子树
    3、查找树进行中序遍历,便是排序好的结果
*/
#ifndef _SEARCH_TREE_H_
#define _SEARCH_TREE_H_

typedef unsigned int uint;

typedef struct n
{
   int data;
   uint key;

   struct n *left;
   struct n *right;
}Node, *pNode, **ppNode;

// 根据一组查找值key生成一颗查找树
pNode create_tree(uint keys[], uint len);
pNode create_node(uint key);

void link_node(pNode cur,pNode parent, uint isleft,pNode left, pNode right);

pNode insert_node(pNode root, pNode node);

pNode delete_node_in_tree(pNode root, pNode node);

pNode search_node(pNode root, uint key);

void pre_order_display(pNode root);
void mid_order_display(pNode root);
void back_order_display(pNode root);

#endif

 search_tree.c

#include "search_tree.h"
#include <stdio.h>
#include <stdlib.h>

pNode search_parent(pNode root, pNode node);

pNode create_tree(uint keys[], uint len)
{
    if (len == 0)
    {
        return NULL;
    }

    pNode root = create_node(keys[0]);

    for (int i = 1; i < len; i++)
    {
        pNode node = create_node(keys[i]);
        insert_node(root, node);
    }
    
    return root;
}

pNode create_node(uint key)
{
    pNode node = (pNode)malloc(sizeof(Node));
    node->key = key;
    node->data = key;

    node->left = NULL;
    node->right = NULL;
    return node;
}

void link_node(pNode cur,pNode parent, uint isleft,pNode left, pNode right)
{
    if (isleft)
    {
        parent->left = cur;
    }else
    {
        parent->right = cur;
    }
    
    cur->left = left;
    cur->right = right;
}

pNode insert_node(pNode root, pNode node)
{
    if (root == NULL )
    {
        return NULL;
    }

    if (node == NULL)
    {
        return root;
    }
    
    if (root->key < node->key)
    {
        if (root->right == NULL)
        {
            link_node(node,root,0,node->left,node->right);
        }else
        {
            insert_node(root->right,node);
        } 
    }else
    {
        if (root->left == NULL)
        {
            link_node(node,root,1,node->left,node->right);
        }else
        {
            insert_node(root->left,node);
        } 
    }
    
    return root;
}

void delete_node(pNode node)
{
    node->left = NULL;
    node->right = NULL;
    
    free(node);
    node = NULL;
}

pNode delete_node_in_tree(pNode root, pNode node)
{
    if (root == NULL || node == NULL)
    {
        return NULL;
    }

    if (root == node)
    {
            if (node->left == NULL && node->right == NULL)
            {
                root = NULL;
            } else if (node->left != NULL && node->right == NULL)
            {
                root = node->left;
            } else if (node->left == NULL && node->right != NULL)
            {
                root = node->right;
            } else
            {
                root = node->left;
                insert_node(root,node->right);
            }
    }
    

    pNode parent = search_parent(root, node);
    if (parent == NULL)
    {
        return root;
    }
        
    if (parent->left == node)
    {
            if (node->left == NULL && node->right == NULL)
            {
                parent->left = NULL;
            } else if (node->left != NULL && node->right == NULL)
            {
                parent->left = node->left;
            } else if (node->left == NULL && node->right != NULL)
            {
                parent->left = node->right;
            } else
            {
                parent->left = node->left;
                insert_node(root,node->right);
            }
    } else
    {
            if (node->left == NULL && node->right == NULL)
            {
                parent->right = NULL;
            } else if (node->left != NULL && node->right == NULL)
            {
                parent->right = node->left;
            } else if (node->left == NULL && node->right != NULL)
            {
                parent->right = node->right;
            } else
            {
                parent->right = node->left;
                insert_node(root, node->right);
            }
    }

    delete_node(node); 
    node = NULL;
    
    return root;
}

pNode search_node(pNode root, uint key)
{
    if (root == NULL)
    {
        return NULL;
    }
    
    if (root->key == key)
    {
        return root;
    }

    if (root->key > key)
    {
       return search_node(root->left, key);
    }
    
    if (root->key < key)
    {
        return search_node(root->right,key);
    }

    return NULL;
}

pNode search_parent(pNode root, pNode node)
{
    if (root == NULL || node == NULL || root == node)
    {
        return NULL;
    }
    
    if (root->left == node || root->right == node)
    {
        return root;
    }
    
    if (node->key > root->key)
    {
       return search_parent(root->right, node);
    } else
    {
        return search_parent(root->left, node);
    }  
}


void pre_order(pNode root, void(*func)(pNode node))
{
    if (root == NULL)
    {
        return ;
    }

    // DLR
    func(root);
    pre_order(root->left,func);
    pre_order(root->right,func);
}
void mid_order(pNode root, void(*func)(pNode node))
{
    if (root == NULL)
    {
        return ;
    }

    // LDR
    mid_order(root->left, func);
    func(root);
    mid_order(root->right,func);
}

void back_order(pNode root, void(*func)(pNode node))
{
    if (root == NULL)
    {
        return ;
    }

    // LRD
    back_order(root->left,func);
    back_order(root->right,func);
    func(root);    
}

void display_node(pNode node)
{
    printf("%d ", node->data);
}

void pre_order_display(pNode root)
{
    pre_order(root,display_node);
    printf("\n");
}

void mid_order_display(pNode root)
{
    mid_order(root,display_node);
    printf("\n");
}

void back_order_display(pNode root)
{
    back_order(root,display_node);
    printf("\n");
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是 c语言实现二叉树查找数据的代码示例: ```c #include <stdio.h> #include <stdlib.h> // 二叉树结点结构体 typedef struct TreeNode { int data; // 结点数据 struct TreeNode* left; // 左子结点 struct TreeNode* right; // 右子结点 } TreeNode; // 查找二叉树中是否存在指定数据 TreeNode* search(TreeNode* root, int data) { if (root == NULL) { return NULL; // 空树,没找到 } if (data == root->data) { return root; // 找到了,返回结点指针 } else if (data < root->data) { return search(root->left, data); // 往左子树查找 } else { return search(root->right, data); // 往右子树查找 } } // 插入数据到二叉树 void insert(TreeNode** rootPtr, int data) { if (*rootPtr == NULL) { // 空结点,新建一个结点 TreeNode* newNode = (TreeNode*) malloc(sizeof(TreeNode)); newNode->data = data; newNode->left = NULL; newNode->right = NULL; *rootPtr = newNode; } else if (data < (*rootPtr)->data) { // 插入到左子树 insert(&((*rootPtr)->left), data); } else { // 插入到右子树 insert(&((*rootPtr)->right), data); } } // 初始化一个二叉搜索树 void initBST(TreeNode** rootPtr) { *rootPtr = NULL; } int main() { TreeNode* root; initBST(&root); // 初始化一个空的二叉搜索树 // 插入一些数据 insert(&root, 8); insert(&root, 3); insert(&root, 10); insert(&root, 1); insert(&root, 6); insert(&root, 14); insert(&root, 4); insert(&root, 7); insert(&root, 13); // 查找数据 TreeNode* node1 = search(root, 6); TreeNode* node2 = search(root, 11); if (node1 == NULL) { printf("未找到数据\n"); } else { printf("找到数据:%d\n", node1->data); } if (node2 == NULL) { printf("未找到数据\n"); } else { printf("找到数据:%d\n", node2->data); } return 0; } ``` 请问下一个问题是什么?

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值