#include <stdio.h>
#include <stdlib.h>
//根: root
//叶子: leaf
typedef struct BinaryTree
{
int val;
struct BinaryTree* left;
struct BinarTree* right;
}BinaryTree;
BinaryTree* CreatNode(int x)
{
BinaryTree* node = (BinaryTree*)malloc(sizeof(BinaryTree));
if (node == NULL)
{
perror("node malloc");
exit(1);
}
node->val = x;
node->left = NULL;
node->right = NULL;
return node;
}
//直接创建树
BinaryTree* CreatBinaryTree1()
{
BinaryTree* node1 = CreatNode(1);
BinaryTree* node2 = CreatNode(2);
BinaryTree* node3 = CreatNode(3);
BinaryTree* node4 = CreatNode(4);
BinaryTree* node5 = CreatNode(5);
BinaryTree* node6 = CreatNode(6);
node1->left = node2;
node2->left = node3;
node1->right = node4;
node4->left = node5;
node4->right = node6;
return node1;
}
//前序
void PrintVal1(BinaryTree* btree)
{
if (btree == NULL)
{
printf("N ");
return;
}
printf("%d ", btree->val); //根
PrintVal1(btree->left); //左子树
PrintVal1(btree->right); //右子树
}
//中序
void PrintVal2(BinaryTree* btree)
{
if (btree == NULL)
{
printf("N ");
return;
}
PrintVal2(btree->left); //左子树
printf("%d ", btree->val); //根
PrintVal2(btree->right); //右子树
}
//后序
void PrintVal3(BinaryTree* btree)
{
if (btree == NULL)
{
printf("N ");
return;
}
PrintVal3(btree->left); //左子树
PrintVal3(btree->right); //右子树
printf("%d ", btree->val); //根
}
//树的高度 第一层为1
int TreeHigh(BinaryTree* btree)
{
if (!btree)
return 0;
int left = TreeHigh(btree->left);
int right = TreeHigh(btree->right);
return left > right ? left + 1 : right + 1;
}
//节点总个数
int TreeNode(BinaryTree* btree)
{
if (btree == NULL)
return 0;
return TreeNode(btree->left) + TreeNode(btree->right) + 1;
}
//第k层节点个数
int TreeKNode(BinaryTree* btree, int k)
{
if (btree == NULL)
return 0;
if (k == 1)
return 1;
return TreeKNode(btree->left, k - 1) + TreeKNode(btree->right, k - 1);
}
//查找值为x的节点
BinaryTree* FindNode(BinaryTree* btree, int x)
{
if (!btree)
return NULL;
if (btree->val == x)
return btree;
BinaryTree* node1 = FindNode(btree->left, x);
if (node1)
return node1;
//BinaryTree* node2 = FindNode(btree->right, x);
//if (node2)
// return node2;
//return NULL;可以简化为下面一句
return FindNode(btree->right, x);
}
//数组创建前序树
//NULL用'#'表示
BinaryTree* CreatBinaryTree2(int* arr, int* pi) // 用指针这样的话i就不会在每一个函数里面的值不同,便于arr[i]的使用
{
if (arr[*pi] == '#')
{
(*pi)++;
return NULL;
}
BinaryTree* node = (BinaryTree*)malloc(sizeof(BinaryTree));
if (node == NULL)
{
perror("node malloc");
exit(1);
}
node->val = arr[(*pi)++];
node->left = CreatBinaryTree2(arr, pi);
node->right = CreatBinaryTree2(arr, pi);
return node;
}
int main()
{
int num[] = { 1, 2, 3, '#', '#', '#', 4, 5, '#', '#', 6, '#', '#' };
int i = 0;
BinaryTree* btree = CreatBinaryTree2(num, &i);
BinaryTree* pos = FindNode(btree, 3);
printf("pos->val = %d", pos->val);
return 0;
}
5409

被折叠的 条评论
为什么被折叠?



