首页 > 其他分享 >二叉树

二叉树

时间:2024-02-15 17:00:13浏览次数:31  
标签:node 遍历 TreeNode int 二叉树 节点

二叉树

「二叉树 binary tree」是一种非线性数据结构,代表着祖先与后代之间的派生关系,体现着“一分为二”的
分治逻辑。与链表类似,二叉树的基本单元是节点,每个节点包含:值、左子节点引用、右子节点引用。

/* 二叉树节点结构体 */
typedef struct TreeNode {
int val; // 节点值
int height; // 节点高度
struct TreeNode *left; // 左子节点指针
struct TreeNode *right; // 右子节点指针
} TreeNode;
/* 构造函数 */
TreeNode *newTreeNode(int val) {
TreeNode *node;
node = (TreeNode *)malloc(sizeof(TreeNode));
node->val = val;
node->height = 0;
node->left = NULL;
node->right = NULL;
return node;
}

每个节点都有两个引用(指针),分别指向「左子节点 left‑child node」和「右子节点 right‑child node」,
该节点被称为这两个子节点的「父节点 parent node」。当给定一个二叉树的节点时,我们将该节点的左子
节点及其以下节点形成的树称为该节点的「左子树 left subtree」,同理可得「右子树 right subtree」。
在二叉树中,除叶节点外,其他所有节点都包含子节点和非空子树。如图 7‑1 所示,如果将“节点 2”视为父
节点,则其左子节点和右子节点分别是“节点 4”和“节点 5”,左子树是“节点 4 及其以下节点形成的树”,
右子树是“节点 5 及其以下节点形成的树”

7.1.1 二叉树常见术语
二叉树的常用术语如图 7‑2 所示。

‧「根节点 root node」:位于二叉树顶层的节点,没有父节点。

‧「叶节点 leaf node」:没有子节点的节点,其两个指针均指向 None 。

‧「边 edge」:连接两个节点的线段,即节点引用(指针)。

‧ 节点所在的「层 level」:从顶至底递增,根节点所在层为 1 。

‧ 节点的「度 degree」:节点的子节点的数量。在二叉树中,度的取值范围是 0、1、2 。

‧ 二叉树的「高度 height」:从根节点到最远叶节点所经过的边的数量。

‧ 节点的「深度 depth」:从根节点到该节点所经过的边的数量。

‧ 节点的「高度 height」:从距离该节点最远的叶节点到该节点所经过的边的数量。

请注意,我们通常将“高度”和“深度”定义为“走过边的数量”,但有些题目或教材可能会
将其定义为“走过节点的数量”。在这种情况下,高度和深度都需要加 1 。

7.1.2 二叉树基本操作

  1. 初始化二叉树
    与链表类似,首先初始化节点,然后构建引用(指针)。

    // === File: binary_tree.c ===
    /* 初始化二叉树 */
    // 初始化节点
    TreeNode *n1 = newTreeNode(1);
    TreeNode *n2 = newTreeNode(2);
    TreeNode *n3 = newTreeNode(3);
    TreeNode *n4 = newTreeNode(4);
    TreeNode *n5 = newTreeNode(5);
    // 构建引用指向(即指针)
    n1->left = n2;
    n1->right = n3;
    n2->left = n4;
    n2->right = n5;

  2. 插入与删除节点
    与链表类似,在二叉树中插入与删除节点可以通过修改指针来实现。图 7‑3 给出了一个示例。

// === File: binary_tree.c ===
/* 插入与删除节点 */
TreeNode *P = newTreeNode(0);
// 在 n1 -> n2 中间插入节点 P
n1->left = P;
P->left = n2;
// 删除节点 P
n1->left = n2;

需要注意的是,插入节点可能会改变二叉树的原有逻辑结构,而删除节点通常意味着删除该
节点及其所有子树。因此,在二叉树中,插入与删除操作通常是由一套操作配合完成的,以实
现有实际意义的操作。

7.1.3 常见二叉树类型

  1. 完美二叉树
    「完美二叉树 perfect binary tree」所有层的节点都被完全填满。在完美二叉树中,叶节点的度为 0 ,其余所
    有节点的度都为 2 ;若树高度为 ℎ ,则节点总数为 2
    ℎ+1 − 1 ,呈现标准的指数级关系,反映了自然界中常
    见的细胞分裂现象。

请注意,在中文社区中,完美二叉树常被称为「满二叉树」

  1. 完全二叉树
    如图 7‑5 所示,「完全二叉树 complete binary tree」只有最底层的节点未被填满,且最底层节点尽量靠左填充。

  1. 完满二叉树
    如图 7‑6 所示,「完满二叉树 full binary tree」除了叶节点之外,其余所有节点都有两个子节点。

  2. 平衡二叉树
    如图 7‑7 所示,「平衡二叉树 balanced binary tree」中任意节点的左子树和右子树的高度之差的绝对值不超过 1 。

7.1.4 二叉树的退化
图 7‑8 展示了二叉树的理想与退化状态。当二叉树的每层节点都被填满时,达到“完美二叉树”;而当所有节
点都偏向一侧时,二叉树退化为“链表”。

‧ 完美二叉树是理想情况,可以充分发挥二叉树“分治”的优势。
‧ 链表则是另一个极端,各项操作都变为线性操作,时间复杂度退化至

标签:node,遍历,TreeNode,int,二叉树,节点
From: https://www.cnblogs.com/lulixiu1999/p/18016359

相关文章

  • 二叉树遍历问题模板
    在二叉树遍历问题中,有三种常见的遍历方式:前序遍历、中序遍历和后序遍历。以下是这三种遍历方式的递归模板:1.前序遍历(PreorderTraversal):defpreorderTraversal(root):ifnotroot:return[]result=[]result.append(root.val)#处理当前节点......
  • 代码随想录算法训练营第十七天| 110.平衡二叉树 257. 二叉树的所有路径 404.左叶
    110.平衡二叉树 题目链接:110.平衡二叉树-力扣(LeetCode)思路:判断平衡二叉树,就是判断两个子树的高度差,继而问题转化为了如何求子树的高度——后序遍历(主要卡在了这里)。递归函数返回的是树的高度,同时用-1来表示退出递归(一开始想着用bool型作为返回值,发现函数不好设计)。同时要关......
  • 863. 二叉树中所有距离为 K 的结点
    首先要将二叉树转换成图,再用bfs做。1,二叉树转换成图用哈希表存当前节点和与其相连的点;通过当前节点于其父节点实现遍历;点击查看代码unordered_map<TreeNode*,vector<TreeNode*>>graph;voidcreateGraph(TreeNode*node,TreeNode*parent){if(!node)......
  • 1339. 分裂二叉树的最大乘积
    这道题关键突破点就是先算出节点总和,然后找到一颗子树总和最接近总和的一半。乘积最大基本就是先要求总和,然后找到最接近总和一半。关键就是这一步,找到最适合子树的和。点击查看代码if(abs(2*cur-sum)<abs(2*best-sum)){best=cur;}完整代码:点击查看......
  • 二叉树层次建树+遍历
    1.BiTree层次建树实现使用二叉树的链式存储,必须要构造一个辅助链式队列,用pcur遍历树结点,实现代码如下:代码实现//二叉树层次建树+画图2024-02-12#include<iostream>#include<cstdio>usingnamespacestd;//树结点的数据结构typedefcharElemType;typedefstructT......
  • 力扣 递归 迭代 栈 广度 队列 之 226. 翻转二叉树
    给你一棵二叉树的根节点root,翻转这棵二叉树,并返回其根节点。 示例1:输入:root=[4,2,7,1,3,6,9]输出:[4,7,2,9,6,3,1]示例2:输入:root=[2,1,3]输出:[2,3,1]示例3:输入:root=[]输出:[]栈/** *Definitionforabinarytreenode. *publicclassTreeNode......
  • 623 在二叉树中增加一行
    深度遍历,就是遍历:1.先要确定有几种情况,像这道题,深度为1,2就是最基本的情况,分为两种处理;2.根据不同情况,进行不同处理,不需要考虑后面递归的传递。3.确认传递的方式,如果函数返回的是指针,就需要left,right接住。完整代码:点击查看代码classSolution{public:TreeNode*ad......
  • 力扣递归 深度优先搜索 之 104. 二叉树的最大深度
    给定一个二叉树root,返回其最大深度。二叉树的最大深度是指从根节点到最远叶子节点的最长路径上的节点数。 示例1: 输入:root=[3,9,20,null,null,15,7]输出:3示例2:输入:root=[1,null,2]输出:2/** *Definitionforabinarytreenode. *publicclassTre......
  • 力扣 145. 二叉树的后序遍历 递归 迭代
    递归/** *Definitionforabinarytreenode. *publicclassTreeNode{ *  intval; *  TreeNodeleft; *  TreeNoderight; *  TreeNode(){} *  TreeNode(intval){this.val=val;} *  TreeNode(intval,TreeNodelef......
  • 力扣 144. 二叉树的前序遍历 递归 迭代
    递归/** *Definitionforabinarytreenode. *publicclassTreeNode{ *  intval; *  TreeNodeleft; *  TreeNoderight; *  TreeNode(){} *  TreeNode(intval){this.val=val;} *  TreeNode(intval,TreeNodelef......