#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;
}
搜索二叉树 递归创建和非递归创建
最新推荐文章于 2022-08-14 11:52:00 发布