#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define TREE_TYPE char
#define EMPTY '#'
#define END '\0'
// 设计二叉树节点结构
typedef struct TreeNode
{
TREE_TYPE data;
struct TreeNode* left;
struct TreeNode* right;
}TreeNode;
// 创建节点
TreeNode* create_tree_node(TREE_TYPE data)
{
TreeNode* node = malloc(sizeof(TreeNode));
node->data = data;
node->left = NULL;
node->right = NULL;
return node;
}
// 按照前序顺序 构建二叉树 结束后返回这颗二叉树的根节点
TreeNode* create_tree(void)
{
TREE_TYPE data = 0;
scanf("%c",&data);
if(EMPTY == data) return NULL;
// 创建根节点
TreeNode* root = create_tree_node(data);
// 左子树继续通过前序构建
root->left = create_tree();
// 右子树同样前序构建
root->right = create_tree();
return root;
}
// 第二种前序构建
/*
TreeNode* create_tree_str(const char** str)
{
if(EMPTY == **str || END == **str) return NULL;
// 构建当前根节点
TreeNode* node = create_tree_node(**str);
// 继续前序构建左子树
*str+=1;
node->left = create_tree_str(str);
// 继续前序构建右子树
*str+=1;
node->right = create_tree_str(str);
return node;
}
*/
TreeNode* _create_tree_str(const char* str,int* index)
{
if(END == str[*index] || EMPTY == str[*index]) return NULL;
TreeNode* node = create_tree_node(str[*index]);
*index+=1;
node->left = _create_tree_str(str,index);
*index+=1;
node->right = _create_tree_str(str,index);
return node;
}
TreeNode* create_tree_str(const char* str)
{
int index = 0;
_create_tree_str(str,&index);
}
// 前序
void dlr_show(TreeNode* root)
{
if(NULL == root) return;
printf("%c ",root->data);
dlr_show(root->left);
dlr_show(root->right);
}
// 中序
void ldr_show(TreeNode* root)
{
if(NULL == root) return;
ldr_show(root->left);
printf("%c ",root->data);
ldr_show(root->right);
}
// 后序
void lrd_show(TreeNode* root)
{
if(NULL == root) return;
lrd_show(root->left);
lrd_show(root->right);
printf("%c ",root->data);
}
// 树的高度
int high_tree(TreeNode* root)
{
if(NULL == root) return 0;
int lh = high_tree(root->left);
int rh = high_tree(root->right);
return lh>rh ? lh+1 : rh+1;
}
// 树的密度
int density_tree(TreeNode* root)
{
if(NULL == root) return 0;
return density_tree(root->left) + density_tree(root->right) + 1;
}
// 插入 把新节点插入到有空子树的父节点下 假设节点值不重复
bool insert_tree(TreeNode* root,TREE_TYPE pdata,TREE_TYPE data)
{
if(NULL == root) return false;
if(root->data == pdata)
{
if(NULL == root->left)
return root->left = create_tree_node(data);
if(NULL == root->right)
return root->right = create_tree_node(data);
return false;
}
if(insert_tree(root->left,pdata,data)) return true;
return insert_tree(root->right,pdata,data);
}
int main(int argc,const char* argv[])
{
const char* str = "ABDG###EH##I##C#FJ###";
//TreeNode* root = create_tree();
TreeNode* root = create_tree_str(str);
insert_tree(root,'C','X');
dlr_show(root);
printf("\n");
ldr_show(root);
printf("\n");
lrd_show(root);
printf("\n");
}
数据结构(二叉树-链式存储)
最新推荐文章于 2024-10-08 20:32:22 发布