
算法
文王梦熊
简书:https://www.jianshu.com/u/4f6fb2124907
展开
-
二叉树遍历(非递归)
0.定义二叉树class Node{public: int value; Node* left = NULL; Node* right = NULL; Node(int v):value(v){}};typedef Node* Tree;typedef Node* pNode;void initTree(Tree &tree){ tree = new Nod...原创 2019-03-14 21:17:59 · 162 阅读 · 0 评论 -
最大子序列和问题的多种解法
1.O(n)的解法/*返回最大和*/int maxSum_1(const int A[], int n){ int thisSum, maxSum; thisSum = maxSum = 0; for (int j = 0; j < n; ++j) { thisSum += A[j]; if (thisSum > maxSum) { maxSum =...原创 2019-03-14 21:50:40 · 198 阅读 · 0 评论 -
二叉查找树实现
0.实现简述查找最小(大)元素:循环或者递归,一直往左(右)深入插入节点:如果树空,则直接创建一个节点(Base case);若非空,判断大小,看属于哪棵子树,递归调用删除节点:如果要删除的元素element<当前节点的值,递归调用在左子树中删除;否则递归调用在右子树中删除。若找到和element值相等的节点,分下面两种情况:若有两个孩子,则将右子树的最小值Min放到当前要删除...原创 2019-03-19 14:45:23 · 300 阅读 · 0 评论 -
AVL树的实现
1.简述AVL树本质是二叉查找树,与二叉查找树不同的是AVL树带有平衡条件平衡条件: 每个节点的左子树和右子树的高度最多相差1,空树的高度为-1插入分以下四种情况:1 对a的左子树的左子树进行一次插入2 对a的左子树的右子树进行一次插入3 对a的右子树的左子树进行一次插入4 对a的右子树的右子树进行一次插入(1/4情况为单旋;2/3情况为双旋转)2.声明#ifndef...原创 2019-03-19 15:58:22 · 261 阅读 · 0 评论 -
栈的应用——后缀表达式
1.思想目标:将中缀表达式转换为后缀表达式思想:读到一个操作数时,放到输出中读到一个操作符时(包括左括号),从占中弹出元素并加入到输出中,直到发现更低的优先级的元素,再将操作符入栈。有一个例外,在未出现右括号时,绝不弹出左括号读到右括号时,弹出栈元素,直至遇到左括号,弹出的元素中,除左括号都加入输出中读到序列末尾,将占中所有元素弹出,加入到输出中2.实现string con...原创 2019-03-15 12:41:42 · 767 阅读 · 0 评论 -
最长回文子串
1.中心扩散int expendCenter(string& s,int begin,int end){ int left=begin; int right=end; while(left>=0&&right<s.size()&&s[left]==s[right]){ le...原创 2019-03-22 22:11:20 · 206 阅读 · 0 评论 -
堆的实现(优先级队列的基础)
1.概览由于堆是一棵完全二叉树,所以可以使用vector存储数据(0位置不放数据) 任意节点i,其左儿子为2i,其右儿子为2i+1,其父亲为i/2(下取整)堆算法主要包含三个:插入(上滤操作)、删除(下滤操作)、建堆(循环下滤操作)2.上滤即插入的过程主要思想:当要插入元素x时,在最后的位置建立一个空穴,判断该空穴是否能放下x,若不能,则上滤空穴(即将父亲的值填入空穴,而将父亲作为...原创 2019-04-23 17:09:05 · 315 阅读 · 0 评论 -
红黑树解析(RB-Tree)
1.RB树需满足的规则节点非红即黑根节点为黑如果节点为红,其儿子必须为黑任一节点到NULL的任何路径,所含的黑节点必须相同一般将NULL看为黑节点2.RB树的插入2.1 自底向上的插入插入的新节点为红色,自底向上的插入算法较为复杂,分为四种情况状况1:P为红,S为黑,【一字型】,单旋,P变为黑色,X和S变为红色状况2:P为红,S为黑,【之字形】,双旋转...原创 2019-04-24 15:12:25 · 584 阅读 · 0 评论