#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
//创建结构体
typedef struct TreeNode
{
int data;
struct TreeNode* left;
struct TreeNode* right;
}TreeNode;
//创建树结点
TreeNode* create_node(int data)
{
TreeNode* node = malloc(sizeof(TreeNode));
node->data = data;
node->left = NULL;
node->right = NULL;
return node;
}
//添加树结点的子函数
void _add_tree(TreeNode** root,TreeNode* node)
{
if(NULL == *root)
{
*root = node;
return;
}
if(node->data < (*root)->data)
_add_tree(&(*root)->left,node);
else
_add_tree(&(*root)->right,node);
}
//值添加树
void add_tree(TreeNode** root,int data)
{
_add_tree(root,create_node(data));
}
//前序遍历
void dlr_show(TreeNode* root)
{
if(NULL == root)
return;
printf("%d ",root->data);
dlr_show(root->left);
dlr_show(root->right);
}
//中序遍历
void ldr_show(TreeNode* root)
{
if(NULL == root)
return;
ldr_show(root->left);
printf("%d ",root->data);
ldr_show(root->right);
}
//树高
size_t hight_tree(TreeNode* root)
{
if(NULL == root)
return 0;
size_t lh = hight_tree(root->left);
size_t rh = hight_tree(root->right);
return lh>rh ? lh+1 : rh+1;
}
//树的密度
size_t density_tree(TreeNode* root)
{
if(NULL == root)
return 0;
return 1+density_tree(root->left)+
density_tree(root->right);
}
//是否平衡
bool blance_tree(TreeNode* root)
{
if(NULL == root)
return true;
int lh = hight_tree(root->left);
int rh = hight_tree(root->right);
return abs(lh-rh)<2 && blance_tree(root->left) &&
blance_tree(root->right);
}
// 查询
TreeNode* query_tree(TreeNode* root,int data)
{
if(NULL == root)
return NULL;
if(data < root->data)
return query_tree(root->left,data);
if(data > root->data)
return query_tree(root->right,data);
return root;
}
//删除
bool del_tree(TreeNode** root,int data)
{
if(NULL == *root)
return false;
if(data < (*root)->data)
return del_tree(&(*root)->left,data);
if(data > (*root)->data)
return del_tree(&(*root)->right,data);
TreeNode* temp = *root;
*root = temp->right;
if(NULL!=temp->left)
_add_tree(root,temp->left);
free(temp);
return true;
}
//修改
bool modify_tree(TreeNode** root,int old,int new)
{
if(del_tree(root,old))
{
_add_tree(root,create_node(new));
return true;
}
return false;
}
int main(int argc,const char* argv[])
{
TreeNode* root = NULL;
for(int i=0; i<10; i++)
{
add_tree(&root,rand()%90+10);
}
ldr_show(root);
printf("\n");
modify_tree(&root,35,100);
ldr_show(root);
}
【数据结构与算法】有序二叉树(左<根<=右)的功能实现
最新推荐文章于 2024-07-25 13:44:24 发布