数据结构
董丹丹第100号
一个学渣属性的技术渣
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
优先级队列与堆的关系
队列具有先进先出的特性,而优先级队列是按照优先级来进行处理。即:优先级队列的出队列操作不是直接将队头元素出队列,而是把队列中优先级最高的元素出队列。 要选出优先级最高的元素则可以借助堆来完成。堆堆分为:最小堆和最大堆。 最小堆: 将数据按照二叉树的方式进行排列,其中每个节点的根节点的值小于其左子树和右子树,与左、右孩子的大小无关,称为最小堆。 最大堆: 将数据按照二叉树的方式进行排列,其中原创 2017-05-11 15:45:50 · 3529 阅读 · 0 评论 -
完全二叉树的判断
要判断是不是完全二叉树,首先要知道什么是完全二叉树? 完全二叉树:如果一棵具有N个结点的二叉树的结构与满二叉树的前N个节点的结构相同,称为完全二叉树。 所以就分了以下几种情况: 该节点有左右子树,继续判断 该节点只有左子树,判断他的下一个节点还有没有子树,如果有就不是 该节点只有右子树,不是 该节点左右子树都没有,判断他的下一个节点还有没有子树,如果有就不是所以,以下就是代码:boo原创 2017-05-07 18:20:20 · 595 阅读 · 0 评论 -
查找两个节点最近的公共祖先
查找一个普通二叉树中两个节点最近的公共祖先。 方法: 1.分别找出两个节点距离根节点的路径并保存在栈中; 2.判断两个栈的长度是否相等,如果不相等,就pop()掉size()值较大的一个直到两个栈的长度相等。 3.分别取两个栈顶的元素,比较值是否相等,若不相等将两个栈顶元素都出栈 ,若相等,则返回栈顶元素。Node* FindCommonAncestorNode(Node* first, N原创 2017-05-07 18:28:30 · 2939 阅读 · 0 评论 -
二叉树的镜像
二叉树的镜像是指将二叉树的每个节点的左右子树交换位置,就像从镜子里看到的一样。 方法一:递归 void BinaryMirror() { return _BinaryMirror(_pRoot); } void _BinaryMirror(Node* pRoot) { if(pRoor == NULL)原创 2017-05-07 18:34:53 · 194 阅读 · 0 评论 -
二叉树三种遍历方式之循环
1.先序遍历 根节点—->左子树—->右子树 void PreOrder_Nor() { cout<<”PreOrder_Nor”<void InOrder_Nor1() { cout<<"InOrder_Nor1"<<endl; if(_pRoot == NULL) return ; s原创 2017-05-07 18:45:40 · 1123 阅读 · 0 评论 -
特殊矩阵之稀疏矩阵
特殊矩阵的第二种–>稀疏矩阵 稀疏矩阵是指矩阵中有效元素远远小于无效值的个数,大概比例就是: 有效值个数/无效值个数~0.05 所以,稀疏矩阵在存储时只需要保存有效元素的位置信息以及值,对于无效值只需要用_invalid来记录。#include <iostream>#include <windows.h>#include <vector>using namespace std;temp原创 2017-04-22 19:29:12 · 2006 阅读 · 0 评论 -
AVL树之插入与判断
二叉搜索树是为了降低遍历的时间复杂度,但是对于单支情况并不能很好的解决,要遍历一个左单支或右单支的二叉树,时间复杂度和链表相同,所以就引入了—>AVL树。 AVL树和一般的搜索二叉树相比有什么不同呢? AVL树在搜索二叉树的基础上每个节点都加了一个平衡因子。 平衡因子的计算方法就是:右子树的深度 - 左子树的深度,或者也可以是,左子树的深度 - 右子树的深度。 当平衡因子的值 >= 2或<=原创 2017-05-28 14:51:46 · 1503 阅读 · 0 评论 -
递归类型的二叉树
1.创建节点结构体template <class T>struct BinaryTreeNode//定义二叉树的节点{ BinaryTreeNode(const T& value) :_value(value) ,_pLeft(NULL) ,_pRight(NULL) {} T _value; BinaryTreeN原创 2017-04-27 16:35:45 · 308 阅读 · 0 评论 -
AVL树的删除
AVL数的删除前面的操作和二叉搜索树的删除操作相同,只是在删除时顺便修改pParent的平衡因子,在删除完后,根据pParent的平衡因子,向上调整平衡因子直到平衡。 当pParent->_bf == 0时,需要向上调整; 当pParent->_bf == 1时,不需要修改,直接退出即可; 当pParent->_bf == 2时,需要进行左旋或右旋。bool Destory(const K&原创 2017-05-29 14:49:24 · 426 阅读 · 0 评论 -
判断叶子结点的个数
template <class T>struct BinaryTreeNode//定义二叉树的节点{ BinaryTreeNode(const T& value) :_value(value) ,_pLeft(NULL) ,_pRight(NULL) {} T _value; BinaryTreeNode<T>* _原创 2017-05-08 10:21:10 · 5329 阅读 · 0 评论 -
线索二叉树的先序、中序、后序遍历
线索化二叉树: 当某个节点的左孩子为空时,将_pLeft指针指向他的前一个节点; 当某个节点的右孩子为空时,将_pRight指针指向它的后一个结点。根据遍历方式不同,得到的前后节点也不同,线索化二叉树分为三种不同的情况: 先序遍历线索化二叉树 中序遍历线索化二叉树 后序遍历线索化二叉树 线索二叉树与普通二叉树有什么区别呢?线索化二叉树中空的指针域至多2个,至少1个; 普通二叉树中空的指原创 2017-05-07 17:59:29 · 1530 阅读 · 0 评论 -
根据前序和中序遍历结果重建二叉树
前序遍历: 根节点—->左子树—->右子树 中序遍历: 左孩子—->根节点—->右子树 根据前序遍历的特性可以得知: 1.前序遍历后的第一个节点就是这棵树的根节点。 2.根据中序遍历找到根节点后,其左边的节点都是根节点的左子树,其右边的节点都是根节点的右子树。 3.用递归的方式将根节点的左子树和右子树分别看成是一棵树。 对于递归出口,可以是:beginPre = endPre be原创 2017-05-07 15:08:56 · 353 阅读 · 0 评论 -
HuffmanTree
要了解HuffmanTree,首先要了解几个概念: 1.二叉树的路径长度:从根结点到每个节点的路径长度之和。 2.带权路径长度:(从根结点到每个叶子结点的路径*每个叶子结点的权限)相加之和。 3.HuffmanTree:带权路径最小的树。 HuffmanTree的构造也用了堆的概念,在每次插入一个数据后,需要调整整棵树,来使得带权路径最小。 Heap:#include <iostream>原创 2017-05-11 16:08:21 · 248 阅读 · 0 评论 -
递归类型的简易迷宫
1.数组类型的简易迷宫#include <iostream>#include <fstream>#include <string>#include <assert.h>using namespace std;#define MAX_COL 10#define MAX_ROW 10struct Seat{ Seat(int x, int y) :_x(x)原创 2017-04-21 11:02:27 · 312 阅读 · 0 评论 -
循环类型的简易迷宫
循环类型的迷宫使用栈来实现的,将已经走过的路压入栈中,如果发现错误,则只需将最上面的路pop出就行,不用判断之前一步的方向。#include <iostream>#include <fstream>#include <string>#include <assert.h>#include <stack>using namespace std;#define MAX_COL 10#defi原创 2017-04-21 16:40:31 · 603 阅读 · 0 评论 -
简单模拟实现队列Queue的模板类
队列的最重要的特点就是先进先出(FIFO),所以需要两个指针来分别进行入队列和出队列。 下面的代码只能简单实现入队列和出队列,以及当容量不足时扩大容量。#include <iostream>#include <windows.h>using namespace std;template<class T>class Queue{public: Queue(size_t capac原创 2017-04-21 17:45:03 · 1306 阅读 · 0 评论 -
特殊矩阵之对称矩阵
对称矩阵的一大特点就是a[i][j] == a[j][i], 可以简单地看作是两个三角形,关于中间一条对角线对称,所以在存储矩阵时,就可以存储一部分,而另一部分可以计算得出。#include <iostream>#include <windows.h>using namespace std;template<class T>class SymmetricMatrix{public:原创 2017-04-22 15:06:39 · 663 阅读 · 0 评论 -
二叉搜索树之非递归
二叉搜索树的定义: 1.每棵子树都有:左子树的值 < 根节点的值 < 右子树的值 2.中序遍历的结果是排序好的。 插入方法: int arr[] = {5,3,4,1,7,8,2,6,0,9}; 删除: 判断要删除的节点的孩子的情况: 代码: 定义节点#pragma once#include <iostream>#include <windows.h>using原创 2017-05-23 17:40:41 · 376 阅读 · 0 评论 -
二叉搜索树之递归
上一篇写的是关于二叉搜索树的递归方法,这次就写一下非递归的方法吧。 首先是插入,递归的插入就非常简单了,先插入根节点,再判断是要插入左子树,还是右子树。 直接上代码吧。bool Insert_Nor(const K& key, const V& value) { return _Insert(_pRoot, key, value); }因为要递归遍历,不能每次都往原创 2017-05-25 17:48:39 · 566 阅读 · 0 评论 -
将二叉搜索树转换成链表
二叉搜索树与双向链表的相同点是: 二叉搜索树右左右指针域,而双向链表也有前去与后继,这样只要按照中序遍历的方法,将二叉树遍历一遍,改变原来的左右指针域的指向,就能变成双向链表。首先将搜索二叉树写成迭代器,迭代器的本质就是指针,用指针++或–的方式,依次获得链表的节点。template<class K, class V>struct BSTNode{ BSTNode(const K& k原创 2017-05-25 18:05:33 · 448 阅读 · 0 评论 -
二叉树之红黑树迭代器
红黑事的性质: 1.每个节点不是红色就是黑色。 2.根节点一定是黑色。 3.没有两个连续的红色节点。 4.每个叶子结点道根的路径上,黑色结点的个数都相等。 5.每个叶子结点的空指针域都是黑色的。 通过这些条件的设定,可以保证最长路径上结点的个数不会超过最短路径上节点个数的两倍。 这是一种极限情况,但是这种情况不可能出现,因为正在插入每个节点时都需要调整。 红黑树插入时要考虑的几种原创 2017-05-29 22:14:07 · 598 阅读 · 0 评论
分享