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题目。