数据结构——搜索二叉树

本篇实现了搜索二叉树的有序创建、查找、查找最大最小节点 以及求父节点

bst.h

#include "bst.h"
typedef struct _TreeNode
{
    int  data;
    struct _TreeNode *left;
    struct _TreeNode *right;
}TreeNode;

void initTree(TreeNode **t);
void insertTreeNode(TreeNode **t, int data);
void insertTreeNodecycle(TreeNode **t,int data);
TreeNode * searchBSTcycle(TreeNode *t,int data);
TreeNode * searchBSTrecursive(TreeNode *t,int data);
TreeNode *minTreeNode(TreeNode *t);
TreeNode *maxTreeNode(TreeNode *t);
TreeNode *getparentTreeNode(TreeNode *t,TreeNode *fNode);
void midorderTraverseTree(TreeNode *t);

bst.c

创建和查找分别用递归和循环实现。

父节点的查找,一可以用递归(静态指针存放parent,注意return的位置,详见代码)

                        二是可用队存储二叉树的层序遍历,当遍历到该节点时return。

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

//初始化一个空树
void initTree(TreeNode **t)
{
    (*t) = NULL;
}

//有序插入  递归实现
void insertTreeNode(TreeNode **t, int data)
{
    if((*t) == NULL)
    {
        (*t) = (TreeNode *)malloc(sizeof(TreeNode));
        (*t)->data = data;
        (*t)->left = (*t)->right = NULL;
    }
    else if(data > (*t)->data)
    {
        insertTreeNode(&((*t)->right),data);
    }
    else
        insertTreeNode(&((*t)->left),data);
}

//有序插入 迭代实现
void insertTreeNodecycle(TreeNode **t,int data)
{
    TreeNode *mt = *t;
    TreeNode *temp;

    //应对一开始的根节点
    if((*t) == NULL)
    {
        (*t) = (TreeNode *)malloc(sizeof(TreeNode));
        (*t)->data = data;
        (*t)->left = (*t)->right = NULL;
    }
    //后续节点
    else
    {
        while(1)
        {
            if(data > mt->data)
            {
                //错误点:mt没有移动 此时mt还是指向root结点 对root操作的
                //                if(mt->right == NULL)
                //                {
                //                    mt = (TreeNode *)malloc(sizeof(TreeNode*));
                //                    mt->data = data;
                //                    mt->left = mt->right = NULL;
                //                    break;

                if(mt->right == NULL)
                {
                    //                    temp = mt->right; 顺序  !!先为temp开创空间之后再把结点拷贝过去,连接起来
                    temp = (TreeNode *)malloc(sizeof(TreeNode));
                    temp->data = data;
                    temp->left = temp->right = NULL;
                    mt->right = temp;
                    break;
                }
                else
                    mt = mt->right;
            }
            else
            {
                if(mt->left == NULL)
                {
                    temp = (TreeNode *)malloc(sizeof(TreeNode));
                    temp->data = data;
                    temp->left = temp->right = NULL;
                    mt->left = temp;
                    break;
                }
                else
                    mt = mt->left;
            }
        }
    }
}

//搜索 循环实现
TreeNode * searchBSTcycle(TreeNode *t,int data)
{
    while(t)
    {
        if(data == t->data)
            return t;
        else if(data > t->data)
            t = t->right;
        else if(data < t->data)
            t = t ->left;
    }
    return NULL;
}

//搜索 递归实现
TreeNode * searchBSTrecursive(TreeNode *t,int data)
{
    if(!t)
        return NULL;
    if(data == t->data)
        return t;
    else if(data > t->data)
//        searchBSTrecursive(t->right,data);    //****查到直接return了****
        return searchBSTrecursive(t->right,data);
    else if(data < t->data)
//        searchBSTrecursive(t->left,data);
        return searchBSTrecursive(t->left,data);
}

//寻找BST最小节点
TreeNode *minTreeNode(TreeNode *t)
{
    if(!t)
        return NULL;
    else
    {
       while(t->left) t = t->left;
       return t;
    }
}

//寻找BST最大节点
TreeNode *maxTreeNode(TreeNode *t)
{
    if(!t)
        return NULL;
    else
    {
       while(t->right) t = t->right;
       return t;
    }
}

//求当前结点的父节点
//递归的奥妙。相当于开启了多 层 函数模块,一层的return只是返回到上一层。而不是整体的递归。
TreeNode *getparentTreeNode(TreeNode *t,TreeNode *fNode)
{
    static TreeNode *parent = NULL; //静态变量 保存parent指针
    if(t)
    {
        if(t->left == fNode || t->right == fNode)
        {
            parent = t;
        }
        getparentTreeNode(t->left,fNode);
        getparentTreeNode(t->right,fNode);
    }
    return parent;
}

//中序打印输出  (正序)
void midorderTraverseTree(TreeNode *t)
{
    if(t != NULL)
    {
        midorderTraverseTree(t->left);
        printf("%-4d",t->data);
        midorderTraverseTree(t->right);
    }
}

对代码逻辑不清晰的建议模拟一个树跟着逻辑画一画。  有问题欢迎来撩~ 。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值