数据结构初阶|【数据结构】 二叉树的简单理解和代码实现

前言:本章主要介绍二叉树的链式结构,及其前序、中序、后序遍历操作,还有 二叉树的其它基本操作包括求结点个数、求叶子结点个数、求第K层结点个数、求二叉树深度等。

文章目录

  • 二叉树的链式结构
    • 二叉树的遍历方式
      • 前序/中序/后续遍历代码实现
  • 二叉树的基本操作
      • 求二叉树结点个数
      • 求二叉树叶子结点个数
      • 求二叉树第K层结点个数
      • 求二叉树的深度/高度
      • 查找二叉树中值为x的结点
  • 二叉树源代码

二叉树的链式结构 链式结构实现如下:
typedef char BTDataType; typedef struct BinaryTreeNode { BTDataType data; struct BinaryTreeNode* right; struct BinaryTreeNode* left; }BTNode;

二叉树的遍历方式 数据结构初阶|【数据结构】 二叉树的简单理解和代码实现
文章图片

前序/中序/后续遍历代码实现
上面已经说到,前序遍历方式为根结点—>左子树—>右子树,我们用下图为例
数据结构初阶|【数据结构】 二叉树的简单理解和代码实现
文章图片

前序遍历代码:
//二叉树前序遍历 void PreOrder(BTNode* root) { if (root == NULL) {printf("NULL "); return; } printf("%c ", root->data); PreOrder(root->left); PreOrder(root->right); }

中序遍历代码:
// 二叉树中序遍历 void InOrder(BTNode* root) { if (root == NULL) {printf("NULL "); return; } InOrder(root->left); printf("%c ", root->data); InOrder(root->right); }

后序遍历代码如下:
// 二叉树后序遍历 void PostOrder(BTNode* root) { if (root == NULL) {printf("NULL "); return; } PostOrder(root->left); PostOrder(root->right); printf("%c ", root->data); }

二叉树的基本操作 求二叉树结点个数
方法一:用全局遍历
1、全局 int size = 0; //这里不妨思考下能不能直接放入BinaryTreeSize函数内部进行定义 int BinaryTreeSize(BTNode* root) { if (root == NULL) {return; } else {++size; } BinaryTreeSize(root->left); BinaryTreeSize(root->right); }

方法二:局部变量
2、遍历-- 局部变量 void BinaryTreeSize(BTNode* root, int* psize) { if (root == NULL) return; else ++(*psize); BinaryTreeSize(root->left, psize); BinaryTreeSize(root->right, psize); }

方法三:
用递归的思想分治,计算二叉树的结点数量,可以认为 数量 = 1 + 左子树数量 + 右子树数量,其中1是当前根结点数量
//3、分治,不再遍历 int BinaryTreeSize(BTNode* root) { return root == NULL ? 0 : 1 + BinaryTreeSize(root->left) + BinaryTreeSize(root->right); }

求二叉树叶子结点个数
按照递归思想,计算二叉树的叶子结点数量,我们可以认为数量等于 = 0 + 左子树叶子结点数量 + 右子树叶子结点数量,0是因为当前根结点有子树,说明根结点不是叶子结点.
//求叶子节点个数 int BinaryTreeLeafSize(BTNode* root) { if (root == NULL) {return 0; } else if (root->left == NULL && root->right == NULL) {return 1; } else {return BinaryTreeLeafSize(root->left) + BinaryTreeLeafSize(root->right); } }

求二叉树第K层结点个数
核心思路:求当前树的第k层=左子树的第k-1层+右子树的第k-1层
//求第k层节点个数 //核心思路:求当前树的第k层=左子树的第k-1层+右子树的第k-1层 int BinaryTreeLevelKSize(BTNode* root, int K) { if (root == NULL) {return 0; } if (K == 1) {return 1; } return BinaryTreeLevelKSize(root->left, K- 1) + BinaryTreeLevelKSize(root->right, K - 1); }

求二叉树的深度/高度
二叉树的高度等于1 + 左右子树高度的最大值.
//二叉树的深度/高度 int BinaryTreeDepth(BTNode* root) { if (root == NULL) {return 0; } int leftDepth = BinaryTreeDepth(root->left); int rightDepth = BinaryTreeDepth(root->right); return leftDepth > rightDepth ? leftDepth + 1 : rightDepth + 1; }

查找二叉树中值为x的结点
递归分治,先判断当前结点是否是目标,然后查找左子树,再查找右子树.
如果左右子树都没有找到,就返回NULL
BTNode* BinaryTreeFind(BTNode* root, BTDataType x) { if (root == NULL) return NULL; if (root->data =https://www.it610.com/article/= x) return root; BTNode* retLeft = BinaryTreeFind(root->left, x); if (retLeft) {return retLeft; } BTNode* retRight = BinaryTreeFind(root->right, x); if (retRight) {return retRight; } return NULL; }

二叉树源代码 二叉树源代码
【数据结构初阶|【数据结构】 二叉树的简单理解和代码实现】数据结构的二叉树内容到此介绍结束了,感谢您的阅读!!!如果内容对你有帮助的话,记得给我三连(点赞、收藏、关注)——做个手有余香的人。

    推荐阅读