二叉树(源码+lw+部署文档+讲解等)

前言

🌞博主介绍:✌全网粉丝15W+,CSDN特邀作者、211毕业、高级全栈开发程序员、大厂多年工作经验、码云/掘金/华为云/阿里云/InfoQ/StackOverflow/github等平台优质作者、专注于Java、小程序技术领域和毕业项目实战,以及程序定制化开发、全栈讲解、就业辅导✌🌞

👇🏻 精彩专栏 推荐订阅👇🏻
2023-2024年最值得选的微信小程序毕业设计选题大全:100个热门选题推荐✅

2023-2024年最值得选的Java毕业设计选题大全:500个热门选题推荐✅

Java精品实战案例《500套》

微信小程序项目精品案例《500套》

💯文末获取源码+数据库💯
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人

二叉树

性质

1, 我们把树中结点的第一个子结点作为这个结点左结点

2, 我们把一个结点右兄弟结点, 作为右结点

通过上述操作可以将普通的树转换为二叉树

二叉树中的节点最多有两个子节点,左右子节点有严格划分,次序不能颠倒

特点:

二叉树在第i层至多有2的(i-1)次方个节点

层次为k的二叉树至多有2的k次方 - 1个节点

对任何一颗二叉树T,如果其叶子节点数为n0 , 度为2的节点数为n2,则n0 = n2 + 1

具有n个节点的完全二叉树,树的高度为log2n (向下取整)。

如果对一颗有n个结点的完全二叉树的结点按层序从1开始编号,则对任意一结点有:
如果编号i为1,则该结点是二叉树的根;
如果编号i > 1,则其双亲结点编号为 parent(i) = i/2,
若 2i > n 则该结点没有左孩子,否则其左孩子的编号为 2i,
若 2i + 1 > n 则该结点没有右孩子,否则其右孩子的编号为 2i + 1。

二叉树的遍历

广度遍历:

深度遍历:

对于一个树深度遍历右6种情况, 如果限定先左后右的话还剩3中
根 左 右 --> 先序/先根 遍历
左 根 右 --> 中序/中根 遍历
左 右 根 --> 后序/后根 遍历

运用的是递归的分治思想,将每个节点的划分为左子树和右子树

二叉树的建树

前序和后序确定的是根节点的位置,中序用来划分左右子树

所以只有前序+中序或者中序+后序才能建树

二叉搜索树

每一个节点的左子节点都比他小,右子节点都比他大

自平衡的二叉搜索树

在二叉搜索树的基础上每一个节点都满足左右子树的高度相差不超过1

设计的原因是因为二叉树在频繁的添加和删除的过程中造成树变得稀疏,于是可以通过旋转的方式来改进

红黑树

根节点可以任意变换颜色,没有连续的红色,黑高平衡

通过旋转来保证黑高平衡,先左旋再右旋,先右旋再左旋,分情况

源码获取

有疑问私信询问我即可~
大家点赞、收藏、关注、评论啦
精彩专栏推荐订阅:在下方专栏👇🏻
Java精品实战案例《500套》
微信小程序项目精品案例《500套》

  • 16
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是C++语言的二叉树加权路径长度计算程序: ```c++ #include <iostream> #include <queue> using namespace std; // 二叉树节点结构体 struct TreeNode { int val; TreeNode* left; TreeNode* right; TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} }; // 计算二叉树的加权路径长度 int getWPL(TreeNode* root) { if (root == nullptr) { return 0; } queue<TreeNode*> q; q.push(root); int wpl = 0; while (!q.empty()) { int size = q.size(); for (int i = 0; i < size; i++) { TreeNode* node = q.front(); q.pop(); if (node->left == nullptr && node->right == nullptr) { // 叶子节点 wpl += node->val; } if (node->left != nullptr) { node->left->val += node->val; // 将左子节点的值累加上父节点的值 q.push(node->left); } if (node->right != nullptr) { node->right->val += node->val; // 将右子节点的值累加上父节点的值 q.push(node->right); } } } return wpl; } int main() { // 构造一棵二叉树 TreeNode* root = new TreeNode(1); root->left = new TreeNode(2); root->right = new TreeNode(3); root->left->left = new TreeNode(4); root->left->right = new TreeNode(5); root->right->left = new TreeNode(6); root->right->right = new TreeNode(7); // 计算二叉树的加权路径长度 int wpl = getWPL(root); cout << "二叉树的加权路径长度是:" << wpl << endl; return 0; } ``` 该程序使用层次遍历的方法计算二叉树的加权路径长度,其中叶子节点的权重就是其值。对于每个非叶子节点,将其子节点的值累加上父节点的值,以便计算更深层节点的权重。最后累加所有叶子节点的权重即可得到二叉树的加权路径长度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值