树总结——精选推荐
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
树总结
特殊树
平衡⼆叉树(AVL树):
平衡⼆叉树⼜称为AVL树,是⼀种特殊的⼆叉排序树。
其左右⼦树都是平衡⼆叉树,且左右⼦树⾼度之差的绝对值不超过1。
由于过于平衡,在插⼊删除时需要⼤量旋转操作的,时间复杂度较⾼。
红⿊树:
是⼀种⼆叉查找树,弱平衡⼆叉树,红⿊树确保没有⼀条路径会⽐其他路径长出两倍。
插⼊最多两次旋转,删除最多三次旋转,最坏时间复杂度O(log n)。
性质:
1. 每个节点⾮红即⿊
2. 根节点是⿊的;
3. 每个叶节点(叶节点即树尾端NULL指针或NULL节点)都是⿊的;
4. 如果⼀个节点是红⾊的,则它的⼦节点必须是⿊⾊的。
5. 对于任意节点⽽⾔,其到叶⼦节点树NULL指针的每条路径都包含相同数⽬的⿊节点;
B+树
维基百科上所定义的⽅式,即关键字个数⽐孩⼦结点个数⼩1,这种⽅式是和B树基本等价的。
下图就是⼀颗阶数为4的B+树。
1)B+树包含2种类型的结点:内部结点(也称索引结点)和叶⼦结点。
根结点本⾝即可以是内部结点,也可以是叶⼦结点。
根结点的
关键字个数最少可以只有1个。
2)B+树与B树最⼤的不同是内部结点不保存数据,只⽤于索引,所有数据(或者说记录)都保存在叶⼦结点中。
3) m阶B+树表⽰了内部结点最多有m-1个关键字(或者说内部结点最多有m个⼦树),阶数m同时限制了叶⼦结点最多存储m-1个记录。
4)内部结点中的key都按照从⼩到⼤的顺序排列,对于内部结点中的⼀个key,左树中的所有key都⼩于它,右⼦树中的key都⼤于等于它。
叶⼦结点中的记录也按照key的⼤⼩排列。
5)每个叶⼦结点都存有相邻叶⼦结点的指针(链表双向查询),叶⼦结点本⾝依关键字的⼤⼩⾃⼩⽽⼤顺序链接。
完全⼆叉树
通常使⽤数组存放,tree[i],该节点的左孩⼦为tree[2i+1],右孩⼦为tree[2i+2]。
遍历
前序遍历
void preTrval(TreeNode *T)
{
stack<TreeNode*> S;
TreeNode *pNode = T;
while (pNode != nullptr || !S.empty())
{
if (pNode != nullptr)
{
cout << pNode->val<<'';
S.push(pNode);
pNode = pNode->left;
}
else
{
pNode = S.top();
S.pop();
pNode = pNode->right;
}
}
}
中序遍历
void midTrval(TreeNode *T)
{
stack<TreeNode*> S;
TreeNode *pNode = T;
while (pNode != nullptr || !S.empty())
{
if (pNode != nullptr)
{
S.push(pNode);
pNode = pNode->left;
}
else
{
pNode = S.top();
S.pop();
cout << pNode->val << '';
pNode = pNode->right;
}
}
}
后序遍历
void postTrval(TreeNode *T)
{
TreeNode *pNode = T;
TreeNode *lastvisit = pNode;
stack<TreeNode*> S;
while (pNode || !S.empty())
{
while (pNode)
{
S.push(pNode);
pNode = pNode->left;
}
pNode = S.top();
if (pNode->right == nullptr || pNode->right == lastvisit) {
cout << pNode->val << '';
S.pop();
lastvisit = pNode;
pNode = nullptr;//输出后获取栈顶
}
else
{
pNode = pNode->right;
}
}
}
按层遍历
void levelTrval(TreeNode *T)
{
queue<TreeNode*> Q;
TreeNode *pNode = T;
Q.push(pNode);
while (!Q.empty())
{
TreeNode *p = Q.front();
Q.pop();
cout << p->val << '';
if (p->left)
Q.push(p->left);
if (p->right)
Q.push(p->right);
}
}。