链式二叉树(3)

目录

Main函数 ​

二叉树第K层的节点个数

整体思路

分析理解

注意事项 

二叉树查找值为x的节点

整体思路

分析理解

注意事项 


Main函数 链式二叉树(3)_第1张图片

#include
#include
#include
#include
#include

//二叉树节点结构体
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;
}

链式二叉树(3)_第2张图片 

二叉树第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层节点个数

分析理解

链式二叉树(3)_第3张图片

链式二叉树(3)_第4张图片

链式二叉树(3)_第5张图片

注意事项 

  • 注意返回值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函数。 

分析理解

链式二叉树(3)_第6张图片

链式二叉树(3)_第7张图片

注意事项 

  • 注意返回值return 是返回给上一层的递归下来的函数,不是返回给最外面
  • 一个一个调用,不是一起调用
  • 递归调用到某一个函数内,这个函数内的变量是不变的例如node2这样的变量
  • 要修改某函数内的值必须传地址修改
  • 返回值必须有变量接收

感谢大家的阅读,若有错误和不足,欢迎指正。下篇开始我们开始练习二叉树的OJ题目。

你可能感兴趣的:(初阶数据结构,数据结构,算法)