链式二叉树(3)

简介: 链式二叉树(3)



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

目录
相关文章
|
6月前
|
C语言
链式二叉树(1)
链式二叉树(1)
55 0
|
6月前
|
DataX
二叉树链式结构的实现(二叉树的遍历以及各种常用功能函数的实现)
二叉树链式结构的实现(二叉树的遍历以及各种常用功能函数的实现)
51 0
|
存储 算法
链式二叉树的基本操作实现(建议收藏!!!)(2)
链式二叉树的基本操作实现(建议收藏!!!)
98 0
|
存储
链式二叉树(二叉树看这一篇就够了)
链式二叉树(二叉树看这一篇就够了)
57 0
|
1月前
|
机器学习/深度学习
二叉树的链式结构
二叉树的链式结构
14 0
|
5月前
【数据结构】链式二叉树的层序遍历
【数据结构】链式二叉树的层序遍历
37 5
|
6月前
|
存储 算法 安全
数据结构与算法:链式二叉树
上一篇文章我们结束了二叉树的顺序存储,本届内容我们来到二叉树的链式存储!
数据结构与算法:链式二叉树
|
6月前
|
存储
二叉树链式结构的实现和二叉树的遍历以及判断完全二叉树
二叉树链式结构的实现和二叉树的遍历以及判断完全二叉树
56 1
|
6月前
|
存储 算法
【链式二叉树】数据结构链式二叉树的(万字详解)
【链式二叉树】数据结构链式二叉树的(万字详解)
|
6月前
链式二叉树(2)
链式二叉树(2)
42 0