数据结构与算法
嵩园
这个作者很懒,什么都没留下…
展开
-
排序算法实现(上)
以下是各种排序算法的C++实现,摘自《C++数据结构与程序设计》,总结起来写成博客来用于温习。①插入排序时间复杂度:O(n^2)。优点:稳定,快。缺点:比较次数不一定,比较次数越少,插入点后的数据移动越多,特别是当数据总量庞大的时候,但用链表可以解决这个问题。数组版实现如下://数组版template void Sortable_list::in原创 2017-06-26 16:19:08 · 355 阅读 · 0 评论 -
中序遍历和后序遍历树构造二叉树
根据中序遍历和后序遍历树构造二叉树样例:给出树的中序遍历: [1,2,3] 和后序遍历: [1,3,2]返回如下的树: 2 / \1 3借鉴上一篇《前序遍历和中序遍历树构造二叉树》,我们知道中序遍历为左->中->右,后序遍历为左->右->中。于是后序遍历的最后一个值即为根节点的值,根据这个值我们在中序遍历中找到根节点左子树和右子树的值,递归构造左子树和右子树即可原创 2017-03-26 09:33:20 · 717 阅读 · 0 评论 -
前序遍历和中序遍历树构造二叉树
根据前序遍历和中序遍历树构造二叉树样例:给出中序遍历:[1,2,3]和前序遍历:[2,1,3]. 返回如下的树: 2 / \1 3我们直到前序遍历是中->左->右,中序遍历是左->中->右。原创 2017-03-26 09:26:58 · 2427 阅读 · 0 评论 -
二叉树最近公共祖先
给定一棵二叉树,找到两个节点的最近公共父节点(LCA)。最近公共祖先是两个节点的公共的祖先节点且具有最大深度。样例:对于下面这棵二叉树 4 / \3 7 / \ 5 6LCA(3, 5) = 4LCA(5, 6) = 7LCA(6, 7) = 7这道题笔者最近在笔试中也遇到过,相对比较简单,代码如下:/** * Def原创 2017-03-25 16:34:32 · 990 阅读 · 0 评论 -
子树
给出两棵树T1、T2,判断T2是否为T1的子树。样例下面的例子中 T2 是 T1 的子树: 1 3 / \ /T1 = 2 3 T2 = 4 / 4下面的例子中 T2 不是 T1 的子树: ...原创 2017-03-25 16:31:31 · 229 阅读 · 0 评论 -
二叉树的路径和
给定一个二叉树,找出所有路径中各节点相加总和等于给定目标值的路径。一个有效的路径,指的是从根节点到叶节点的路径。样例:给定一个二叉树,和 目标值 = 5: 1 / \ 2 4 / \ 2 3返回:[ [1, 2, 2], [1, 4]]/** * Definition of TreeNode: * cl原创 2017-03-25 16:28:18 · 336 阅读 · 0 评论 -
三个二叉树的简单问题
本文给出三个二叉树的简单问题的答案,因其简单易懂,笔者就不多说了,直接上代码。一.找出二叉树最大值的节点//找出二叉树最大值的节点class Solution {public: /** * @param root the root of binary tree * @return the max node */ TreeNode* maxN原创 2017-03-25 16:23:11 · 537 阅读 · 0 评论 -
将二叉查找树转换成双链表
将一个二叉查找树按照中序遍历转换成双向链表样例给定一个二叉查找树: 4 / \ 2 5 / \1 3返回 12345/** * Definition of TreeNode: * class TreeNode { * public: * int val; * TreeNode *left, *right;原创 2017-04-10 22:12:49 · 263 阅读 · 0 评论 -
二分查找的两种实现方式
笔者在这里给出二分查找的两种实现方式。一. 第一种是健忘版的二分查找,即不管是否已经找到target,查找算法都继续对表进行再分,知道剩下的表的长度为1。递归实现如下:Error_code recursive_binary_1(const Ordered_list &the_list, const Key &target, int bottom, int top, int &posit原创 2017-03-26 21:39:20 · 1944 阅读 · 0 评论 -
翻转二叉树
翻转一棵二叉树。 样例: 1 1 / \ / \2 3 => 3 2 / \ 4 4问题比较简单,这里给出递归和非递归的做法。递归实现:/** * Definition of TreeNode: * class TreeNode { * public:原创 2017-04-10 21:19:09 · 214 阅读 · 0 评论 -
二叉树的前序、中序、后序、层次遍历的递归与非递归实现
二叉树的遍历有前序遍历、中序遍历、后序遍历、层次遍历等,笔者在这里总结一下各种遍历的实现。一.前序遍历。前序遍历访问节点顺序为:根节点->左子节点->右子节点。递归实现如下:void preorder(TreeNode* root, vector& nodes) { if (!root) return; nodes.push_back(root -> val);原创 2017-03-15 19:01:58 · 688 阅读 · 0 评论 -
深度优先与广度优先算法
图的遍历有深度优先和广度优先算法。深度优先遍历可描述为一个递归算法。当到达顶点v时,具体操作是:①访问(v);②for(与v相邻的每个顶点w)遍历(w);//深度优先算法templatevoid Diagraph::depth_first(void(*visit)(Vertex &)) const { bool visited[max_size]; //引入数组防止无限循原创 2017-02-23 21:53:54 · 481 阅读 · 0 评论 -
排序算法实现(下)
④希尔排序时间复杂度:n^1.25 ~ 1.6n^1.25。优点:快,数据移动少。缺点:不稳定,增量的选择无法确切知道,只能凭经验来取。template <class Record>void Sortable_list<Record>::shell_sort() { int increment, start; increment =...原创 2017-06-26 16:21:07 · 322 阅读 · 0 评论