目录
Main函数
二叉树第K层的节点个数
整体思路
分析理解
注意事项
二叉树查找值为x的节点
整体思路
分析理解
注意事项
Main函数
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
#include<math.h>
//二叉树节点结构体
typedef int BTDataType;
typedef struct BinaryTreeNode
{
BTDataType data;
struct BinaryTreeNode* left;
struct BinaryTreeNode* right;//
}BTNode;
//手动建造一个二叉树
//放入数据,左右置为NULL
BTNode* BuyNode(int x)
{
BTNode* tmp = (BTNode*)malloc(sizeof(BTNode));
assert(tmp);
if (tmp == NULL)
{
perror("malloc fail");
return;
}
tmp->data = x;
tmp->left = NULL;
tmp->right = NULL;
return tmp;
}
//放入数据链接成树
BTNode* CreatBinaryTree()
{
BTNode* node1 = BuyNode(1);
BTNode* node2 = BuyNode(2);
BTNode* node3 = BuyNode(3);
BTNode* node4 = BuyNode(4);
BTNode* node5 = BuyNode(5);
BTNode* node6 = BuyNode(6);
//BTNode* node7 = BuyNode(1);
node1->left = node2;
node1->right = node4;
node2->left = node3;
node4->left = node5;
node4->right = node6;
return node1;
}
//前序
void PreOrder(BTNode* root)
{
if (root == NULL)
{
printf("N ");
return;
}
printf("%d ", root->data);//根
PreOrder(root->left);//左
PreOrder(root->right);//右
}
int main()
{
BTNode* root = CreatBinaryTree();
int treeKsize=BinaryTreeLevelKSize(root, 3);
printf("%d ", treeKsize);
printf("\n");
PreOrder(root);
BTNode* FindX = BinaryTreeFind(root, 5);
FindX->data = 7;
printf("\n");
PreOrder(root);
return 0;
}
二叉树第K层的节点个数
// 二叉树第k层节点个数
int BinaryTreeLevelKSize(BTNode* root, int k)
{
if (root == NULL)
{
return 0;
}
if (k == 1)//到第k层就回归
{
return 1;
}
return BinaryTreeLevelKSize(root->left, k - 1) + BinaryTreeLevelKSize(root->right, k - 1);
}
整体思路
- 分治思想
- 若为空树/k=0则返回0
- 若k=1则返回1
- 若k既不等于0也不等于1 则返回左子树的k-1层+右子树的k-1层
- 整个树的第k层节点个数=左子树的k-1层节点个数+右子树的k-1层节点个数
分析理解
注意事项
- 注意返回值return 是返回给上一层的递归下来的函数,不是返回给最外面
- 一个一个调用,不是一起调用
- 递归调用到某一个函数内,这个函数内的变量是不变的例如K,node2这样的变量
二叉树查找值为x的节点
// 二叉树查找值为x的节点
BTNode* BinaryTreeFind(BTNode* root, BTDataType x)
{
if (root == NULL)
{
return NULL;
}
if (root->data == x)
{
return root;
}
BTNode* left = BinaryTreeFind(root->left, x);
if (left)
{
return left;
}
BTNode* right = BinaryTreeFind(root->right, x);
if (right)
{
return right;
}
return NULL;
}
整体思路
- 遍历一遍二叉树,查找值为x的节点地址,返回给Main函数
- 若为空树,则返回NULL
- 若值相等则返回地址给上一层函数。
- 上一层函数接收再返回给上一层直到返回为Main函数。
分析理解
注意事项
- 注意返回值return 是返回给上一层的递归下来的函数,不是返回给最外面
- 一个一个调用,不是一起调用
- 递归调用到某一个函数内,这个函数内的变量是不变的例如node2这样的变量
- 要修改某函数内的值必须传地址修改
- 返回值必须有变量接收
🙂感谢大家的阅读,若有错误和不足,欢迎指正。下篇开始我们开始练习二叉树的OJ题目。