搜索二叉树 递归创建和非递归创建

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


/*创建一颗 搜索二叉树 结构体*/
typedef struct TreeNode{
    int data;
    struct TreeNode *leftTree;
    struct TreeNode *rightTree;
}TreeNode;

/*中序递归遍历*/    /* 递归的本质是压栈 */
void mid_travel(TreeNode *Node)
{
    if(Node)   /*如果节点不为空,就进入*/
    {
        mid_travel(Node->leftTree);
        printf("%d ",Node->data);
        mid_travel(Node->rightTree);
    }
}

/*往树中插入数据*/
void insertNode(TreeNode **r,int data)
{
    TreeNode *t = (*r);
    if((*r) == NULL)  /*刚开始是空树;创建树*/
    {
        /*申请一个空间,用来存储根节点*/
        *r = (TreeNode *)malloc(sizeof(TreeNode));
        /*初始化根节点*/
        (*r)->data = data;
        (*r)->leftTree = (*r)->rightTree = NULL;
    }
    else  /*如果不是空树,插入子树*/
    {
        /*因为下面不在涉及指向问题了,所以不再使用(*r),转而用t 代替*/
        while(1)
        {
           /*搜索二叉树,必须按照一定的顺序插入*/
            if(data > t->data)    /*大于,在右*/
            {
                if(t->rightTree == NULL)
                {
                    /*先创建一块空间,然后初始化   和创建根节点的方法一样*/
                    t->rightTree = (TreeNode *)malloc(sizeof(TreeNode));
                    t->rightTree->data = data;
                    t->rightTree->leftTree = t->rightTree->rightTree = NULL;
                    break;
                }
                /*如果不为空,指向下一个节点,然后继续往下执行。如果data <= t->data
                  执行下面的。如果不是,通过wile(1),再执行上面的*/
                t = t->rightTree;
            }
            else
            {
                if(t->leftTree == NULL)
                {
                    /*创建内存,并初始化*/
                    t->leftTree = (TreeNode *)malloc(sizeof(TreeNode));
                    t->leftTree->data = data;
                    t->leftTree->leftTree = t->leftTree->rightTree = NULL;
                    break;
                }
                t = t->leftTree;
            }
        }
    }
}
/*搜索二叉树 添加节点 的 递归写法*/
void inser_node(TreeNode **r,int data)
{
    if((*r)==NULL)
    {
        /*创建树根*/
        (*r) = (TreeNode*)malloc(sizeof(TreeNode));
        (*r)->data = data;
        (*r)->leftTree = (*r)->rightTree = NULL;
    }
    else
    {
        if(data > (*r)->data)
            inser_node(&(*r)->rightTree,data);
        else
            inser_node(&(*r)->leftTree,data);
    }
}

/*销毁树     递归实现*/
void destroy_tree(TreeNode *root)
{
    if(root)
    {
        destroy_tree(root->leftTree);
        destroy_tree(root->rightTree);
        free(root);
    }
}
int main(void)
{
    /*不赋初值,运行没效果*/
    TreeNode *root = NULL;
    int data[]={6,2,8,1,5,3,4};
    int i = 0,num =7;

    for(i=0;i<num;i++)
    {
        inser_node(&root,data[i]);
    }
    /*中序遍历*/
    mid_travel(root);

    /*销毁树     递归实现*/
    destroy_tree(root);
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

One Piece&

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值