数据结构和算法
灰勒塔钱兔
合肥工业大学
展开
-
如何打印一个结点到根结点的路径并且打印该节点所在的层数(该节点到根结点的长度)
//首先解决二叉树的问题必须把根结点和左右结点分开解决 //如何找到这个结点的路径呢? 利用栈的特点 每次遍历一个结点 首先将它入栈 //之后判断这个结点是否等于所要查询的结点 若等于直接打印栈里的元素 直到栈空 //若不等于 依次递归它的左右节点 若一个结点的左右节点均没有找到目标 则出栈该结点 //直到找到 height即为该节点的高度 以及到根结点的长度(边数) void Fi...原创 2018-12-02 16:06:30 · 677 阅读 · 1 评论 -
堆排序完整实现
首先关于堆排序 它是选择排序的进阶版 不要误认为真的是堆,其实是数组,只不过理解成堆(有助于排序),有大顶堆(开头元素最大) 还有小顶堆(开头元素最小) ,它和我们前面学的二叉树结构有很大的相似度 刚开始时要把待排序这个序列构建成一个大顶堆或小顶堆 即满足根结点元素要比它的每个子结点元素都要大 。 它就是不断通过构建完全二叉树 ,每次把最大的元素调整到堆顶(也可以把最小的元素调整到堆顶)...原创 2018-12-04 23:34:57 · 136 阅读 · 0 评论 -
平衡二叉树(AVL)的完整实现
#include "stdafx.h" #include <iostream> #define LH 1 #define EH 0 #define RH -1 using namespace std; typedef struct BiTNode { int data; int bf; //平衡因子 BiTNode *lchild, *rchild; }BiTNod...原创 2018-11-30 23:57:46 · 221 阅读 · 0 评论 -
如何求一个森林的高度
//首先用二叉链表形式(孩子—兄弟链表)表示一个森林 //在求二叉树高度基础上加以修改 //每次右子树的高度不发生改变 (因为它们在森林上都是在同一层上) int Height(BiTree T) { if (T == NULL) { return 0; } else { int a, b; a = Height(T->lchild)+1; b = Height(...原创 2018-12-01 23:34:04 · 3190 阅读 · 2 评论 -
如何判断一个二叉树是否是二叉排序树(二叉查找树)
以下用递归的方法来解决: bool IsBSTree(BiTree T) { if (!T) { //若传入的是空树,则返回false。 return false; } else if (T->lchild == NULL && T->rchild == NULL) { //若...原创 2018-12-07 23:05:21 · 5331 阅读 · 2 评论 -
如何将树的 "二叉链表存储形" 式转化为 "顺序存储形式" 以及树的 “顺序存储形式” 转化为 “二叉链表存储形式”
//首先将树的二叉链表存储形式转化为树的顺序存储形式 //首先知道树的顺序存储结构 它是利用完全二叉树的性质来定义的 不管一棵二叉树什么结构 它都可以补全成完全二叉树 //其实我们把二叉树的顺序表从1开始 (有些也可以从0开始 此时它的左右孩子就变成了 2*i+1 / 2*i+2) //它的左右孩子为2*i 2*i+1 可以直接通过树的遍历算法来实现 用树的结点来做索引...原创 2018-12-03 23:25:41 · 4537 阅读 · 3 评论 -
直接插入排序以及希尔排序(ShellSort)
希尔排序是直接插入排序的优化版 它的思想就是先让局部有序,然后再让整体有序。也就是先对局部进行直接插入排序,然后在对整体进行直接排序。 对局部直接插入排序也就是不断改变步长,最后再让步长等于1,也就是对整体进行直接插入排序。 这是直接插入排序实现: void InsertSort(int k[], int n) { //n为元素个数 int i, j; for (i = 2; ...原创 2018-12-06 21:55:44 · 158 阅读 · 0 评论 -
森林孩子—兄弟链表形式的层次遍历
关于森林(孩子-兄弟链表形式)的层次遍历:它类似于图的广度优先搜索(BFS) 首先要清楚孩子-兄弟链表表示森林的特点。 接下来看伪代码: //使用队列来依次存储同层结点 void LevelTraverse(csTree T) { //csTree 表示树的结构体指针 csTree P = T; csTree K ; Queue sqQueue;...原创 2018-12-15 23:27:50 · 4868 阅读 · 4 评论