首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
SAAS
ToB门户
了解全球最新的ToB事件
论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
微博
Follow
记录
Doing
博客
Blog
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
排行榜
Ranklist
相册
Album
应用中心
qidao123.com ToB IT社区-企服评测·应用市场
»
论坛
›
软件与程序人生
›
DevOps与敏捷开发
›
数据结构——树
返回列表
发新帖
数据结构——树
[复制链接]
发表于 2025-12-15 12:22:36
|
显示全部楼层
|
阅读模式
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要
登录
才可以下载或查看,没有账号?
立即注册
×
参考:数据结构(C++版)第2版 [王红梅]
树和二叉树
根本术语
结点的度、树的度
:某结点拥有子树的个数为该结点的度(degree),各节点中度最大的值为树的度
叶子结点、分支节点
:度即是0的结点为叶子节点(leaf node),度不即是0的结点为分支节点(branch node)
结点的层数、树的深度
:根节点的层数为1,其孩子节点的层数为k + 1层,层数的最大值为树的深度
二叉树概念
满二叉树
全部门支结点都存在左右子树,全部叶子结点都在同一层,如许的二叉树称为满二叉树
完全二叉树
叶子结点只能出如今末了两层上,末了一层的叶子结点都会集在二叉树的左侧。度为1的结点只大概有一个,且这个结点只有左孩子。
二叉树的性子
第 i 层最多有 2^(i - 1) 个结点 (i >= 1)
在深度为 k 的二叉树中,最少有 k 个结点,最多有 2^k - 1
二叉树中叶子结点的个数为n0,度为2的结点为n2,则n0 = n2 + 1
具有n个结点的完全二叉树的深度为
对于完全二叉树,从根节点开始举行编号,对于恣意为 i 编号的结点有
:
i > 1,则 i 的双亲结点编号为 i / 2
2i <= n,则 i 的左孩子为 2i
2i + 1<= n,则 i 的右孩子为 2i + 1
二叉树的
存储
次序
存储
用数组来映射二叉树的编号,将二叉树按照完全二叉树举行编号,根据二叉树的性子举行映射
二叉链表
插入结点,按照层序插入
void AddNode(int val)
{
TreeNode* node = new TreeNode(val);
if (!root)
{
root = node;
return;
}
queue<TreeNode*> qu;
qu.push(root);
while (!qu.empty())
{
TreeNode* t = qu.front();
qu.pop();
if (t->left) qu.push(t->left);
else
{
t->left = node;
return;
}
if (t->right) qu.push(t->right);
else
{
t->right = node;
return;
}
}
}
复制
代码
二叉树的遍历
广度遍历
广度遍历即层序遍历
void LeverOder(TreeNode* node)
{
if (node == nullptr) return;
queue<TreeNode*> q;
q.push(node);
while (!q.empty())
{
TreeNode* t = q.front();
q.pop();
q.push(t->left);
q.push(t->right);
cout << t->val << " ";
}
}
复制
代码
深度遍历
深度遍历有前序遍历、中序遍历、后续遍历
1.前序遍历
:
根结点
→ 左子树 → 右子树
递归方法:
void PreOder(TreeNode* node)
{
if (node == nullptr) return;
cout << node->val << " ";
PreOder(node->left);
PreOder(node->right);
}
复制
代码
非递归方法:使用栈
void PreOder(TreeNode* root)
{
vector<int> vec;
stack<TreeNode*> st;
st.push(root);
while (!st.empty())
{
TreeNode* tnode = st.top();
vec.push_back(tnode->val);
st.pop();
if (tnode->right != nullptr) st.push(tnode->right);
if (tnode->left != nullptr) st.push(tnode->left);
}
}
复制代码
2.中序遍历
:左子树→
根结点
→ 右子树
递归方法:
void InOder(TreeNode* node)
{
if (node == nullptr) return;
PreOder(node->left);
cout << node->val << " ";
PreOder(node->right);
}
复制代码
非递归方法:
void InOrder(TreeNode* root)
{
vector<int> vec;
stack<TreeNode*> st;
TreeNode* tnode = root;
while (!st.empty() || tnode != nullptr)
{
if (tnode != nullptr)
{
st.push(tnode);
tnode = tnode->left;
}
else
{
TreeNode* top = st.top();
st.pop();
vec.push_back(top->val);
tnode = top->right;
}
}
}
复制代码
3.后序遍历
:左子树 → 右子树 →
根结点
递归方法:
void InOder(TreeNode* node)
{
if (node == nullptr) return;
PreOder(node->left);
cout << node->val << " ";
PreOder(node->right);
}
复制代码
二叉搜索树
二叉搜索树又称为二叉排序树、二叉查找树
特点
非空左子树的全部键值小于其根结点的键值。
非空右子树的全部键值大于其根结点的键值。
左、右子树都是二叉搜索树。
查找最大和最小元素
最大元素肯定是在树的最右分枝的端结点上。
最小元素肯定是在树的最左分枝的端结点上。
次序
二叉搜索树的中序遍历是有序的
题单:
530.二叉搜索树的最小绝对差
回复
使用道具
举报
返回列表
浏览过的版块
前端开发
公有云
花瓣小跑
+ 我要发帖
登录后关闭弹窗
登录参与点评抽奖 加入IT实名职场社区
去登录
微信订阅号
微信服务号
微信客服(加群)
H5
小程序
快速回复
返回顶部
返回列表