二叉树——递归与非递归
文章平均质量分 80
在计算机科学中,二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”和“右子树”。二叉树常被用于实现二叉查找树和二叉堆。
二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。
poison_biti
这个作者很懒,什么都没留下…
展开
-
平衡二叉树——红黑树
“test.cpp”#includeusing namespace std;enum COLOUR{ BLACK, RED,};templatestruct RBTreeNode{ K _key; V _value; COLOUR _col; RBTreeNode* _left; RBTreeNode* _right; RBTreeNode* _parent;原创 2016-10-30 21:23:57 · 445 阅读 · 0 评论 -
360面试题——搜索二叉树转换成有序的双向链表
360面试题——(不允许创建新的节点)搜索二叉树转换成有序的双向链表这道题有两种思路,一种是创建节点,中序遍历搜索二叉树,然后链表尾插。第二种是线索化二叉树的思想(思路二才是符合题目要求的)核心代码 Node* TreeToList() { if(_root == NULL) { return NULL; } Node* prev = NULL;原创 2016-10-09 16:46:02 · 623 阅读 · 0 评论 -
高度平衡的二叉树——AVLTree
旋转图解在代码的后头AVL树本质上还是一棵二叉搜索树(因此读者可以看到我后面的代码是继承自二叉搜索树的),它的特点是:1. 本身首先是一棵二叉搜索树。 2. 带有平衡条件:每个结点的左右子树的高度之差的绝对值(平衡因子)最多为1。原创 2016-07-22 16:13:03 · 437 阅读 · 0 评论 -
高效的平衡搜索树——红黑树
红黑树是每个节点都带有颜色属性的二叉查找树,颜色或红色或黑色。在二叉查找树强制一般要求以外,对于任何有效的红黑树我们增加了如下的额外要求:性质1. 节点是红色或黑色。性质2. 根节点是黑色。性质3 每个叶节点是黑色的。性质4 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)红黑树的插入分为以下三种情况第原创 2016-07-24 23:53:19 · 1068 阅读 · 0 评论 -
数据结构——线索化二叉树
将二叉树变为线索二叉树的过程称为线索化。按某种次序将二叉树线索化的实质是:按该次序遍历二叉树,在遍历过程中用线索取代空指针。算法根据二叉树遍历的方式而定。只需要将遍历算法中访问结点的操作具体化为建立正在访问的结点与其非空中序前趋结点间线索。该算法应附设一个指针pre始终指向刚刚访问过的结点(pre的初值应为NULL),而指针p指示当前正在访问的结点。结点*pre是结点*p的前趋,而*p是*pre的后继。前序线索化和后序线索化算法与二叉树的中序线索化类似。原创 2016-07-29 14:14:31 · 431 阅读 · 0 评论 -
适用于外查找的平衡树——B树
什么是B树: 1970年,R.Bayer和E.mccreight提出了一种适用于外查找的树,它是一种平衡的多叉树,称为B树(或B-树、B_树)。在B-树中查找给定关键字的方法是,首先把根结点取来,在根结点所包含的关键字K1,…,kj查找给定的关键字(可用顺序查找或二分查找法),若找到等于给定值的关键字,则查找成功;否则,一定可以确定要查的关键字在某个Ki或Ki+1之间,于是取Pi原创 2016-08-02 23:44:59 · 825 阅读 · 0 评论 -
数据结构——实现最大堆
什么是堆:堆数据结构是一种数组对象,它可以被视为一科完全二叉树结构。它的特点是父节点的值大于(小于)两个子节点的值(分别称为大顶堆和小顶堆)。它常用于管理算法执行过程中的信息,应用场景包括堆排序,优先队列等。什么是最大堆:最大堆是堆的两种形式之一。根结点(亦称为堆顶)的关键字是堆里所有结点关键字中最大者,称为大根堆,又称最大堆(大顶堆)。大根堆要求根节点原创 2016-08-05 18:08:22 · 704 阅读 · 0 评论 -
实现大堆小堆——仿函数的应用
仿函数:就是使一个类的使用看上去象一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了。“Test.cpp”#define _CRT_SECURE_NO_WARNINGS 1#include using namespace std;#include "Heap.h"void Test(){ int arr[] = {10,16,原创 2016-08-06 10:46:01 · 429 阅读 · 0 评论 -
堆的应用——在N个数中找到最大的前K个数
在堆的应用中,有一道很经典的面试题,题目是:“在100w个数中找到最大的100个数”。对于堆的相关知识和堆实现的代码在我的前2前博客中都有详解,对于这道题会有很大的帮助。 让我们来剖析一下这道题,我们先建立两个数组,一组数组arr的大小为N,另一组数组topk的大小为K,显然,我们要对topk建堆。找最大的前K个数字自然要建立小堆。则根节点(即topk[0])是K个数字中最小的一原创 2016-08-18 12:20:27 · 762 阅读 · 0 评论 -
遍历二叉树——递归遍历
“test.cpp”#includeusing namespace std;templatestruct BinaryTreeNode{ T _data; BinaryTreeNode* _left; BinaryTreeNode* _right; BinaryTreeNode(const T& data = T()) :_data(data) ,_left(NUL原创 2016-09-26 23:03:07 · 953 阅读 · 0 评论 -
遍历二叉树——非递归遍历
“test.cpp”#includeusing namespace std;#include#includetemplatestruct BinaryTreeNode{ T _data; BinaryTreeNode* _left; BinaryTreeNode* _right; BinaryTreeNode(const T& data = T()) :_data(原创 2016-09-28 14:14:48 · 546 阅读 · 0 评论 -
线索化二叉树
“test.cpp”#includeusing namespace std;#includeenum Tag{ THREAD, LINK,};templatestruct BinaryTreeThdNode{ T _data; BinaryTreeThdNode* _left; BinaryTreeThdNode* _right; Tag _lefttag;原创 2016-10-01 14:22:46 · 491 阅读 · 0 评论 -
数据结构——排序/搜索二叉树(非递归)的基本操作实现
什么是搜索二叉树: 二叉树(binary)是一种特殊的树。二叉树的每个节点最多只能有2个子节点:由于二叉树的子节点数目确定,所以可以直接采用上图方式在内存中实现。每个节点有一个左子节点(left children)和右子节点(right children)。左子节点是左子树的根节点,右子节点是右子树的根节点。 如果我们给二叉树加一个额外的条件,就可以得到一种被称作二叉原创 2016-07-02 22:28:15 · 571 阅读 · 0 评论 -
数据结构——排序/搜索二叉树(递归)的基本操作实现
下面是用C++语言递归的实现的二叉搜索树,并有搜索,插入,删除,寻找最大最小节点的操作。非递归实现请看我的上一篇博客"BSTreeR.h"#pragma oncetemplateclass BSTreeRNode{public: K _key; V _value; BSTreeRNode* _left; BSTreeRNode* _right原创 2016-07-03 11:36:03 · 890 阅读 · 0 评论 -
遍历二叉树——递归和非递归(栈和队列的应用)实现
"BinaryTree.h"#pragma once#include #include templateclass BinaryTreeNode{public: T _date; BinaryTreeNode* _left; BinaryTreeNode* _right;public: BinaryTreeNode(const T& date原创 2016-07-06 14:24:52 · 1000 阅读 · 1 评论 -
遍历二叉树——递归实现
二叉树是面试官经常考的面试题,只要熟悉了二叉树的结构,就能很轻松的对付各种问题原创 2016-07-03 14:06:17 · 394 阅读 · 0 评论 -
数字三角形——递归求解
一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,和最大的路径称为最佳路径。任务就是求出最佳路径上的数字之和。注意:路径上的每一步只能从一个数走到下一层上和它最近的左边的数或者右边的数。 以下是代码实现#include using namespace std;#define MAX 100int Arr原创 2016-07-06 13:19:24 · 3527 阅读 · 0 评论