数据结构笔记
Posted Keep--Silent
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构笔记相关的知识,希望对你有一定的参考价值。
目录
数据结构
第一章 绪论
算法复杂度
T ( n ) = 1 a × T ( n b ) + c × n k T(n)=\\left\\\\beginaligned &1\\\\ &a\\times T(\\cfrac nb)+c \\times n^k \\endaligned\\right. T(n)=⎩⎪⎨⎪⎧1a×T(bn)+c×nk
⇓ \\Downarrow ⇓
T ( n ) = n log b ( a ) , a > b k n k × log b ( n ) , a = b k n k , a < b k T(n)=\\left\\\\beginaligned &n ^\\log_b(a), &a>b^k\\\\ &n^k \\times \\log_b(n),&a=b^k\\\\ &n^k , &a<b^k\\\\ \\endaligned\\right. T(n)=⎩⎪⎪⎨⎪⎪⎧nlogb(a),nk×logb(n),nk,a>bka=bka<bk
第三章 栈、队列和数组
栈
出栈不同排列个数 卡特兰数: C 2 n n n + 1 \\cfracC^n_2nn+1 n+1C2nn
第四章 串
模式匹配KMP
const int Size = 1e6 + 10;
int mynext[Size];
void get_next(string t)
t += ' ';
int n = t.size(), i = 0, j = -1;
mynext[0] = -1;
while (i < n)
if (j == -1 || t[i] == t[j])
mynext[++i] = ++j;
else j = mynext[j];
vector<int> get_all_point(string s, string t)
vector<int> ans;
int i = 0, j = 0;
int sn = s.size(), tn = t.size();
t += ' ';
while (i < sn && j <= tn)
if (j == -1 || s[i] == t[j])
i++; j++;
else
j = mynext[j];
if (j == tn)ans.push_back(i - tn);
return ans;
第五章 树和二叉树
基本性质
假设总结点数是 n n n,度为 0 0 0的点有 n 0 n_0 n0个,度为 1 1 1的点有 n 1 n_1 n1个,度为 x x x的点有 n x n_x nx个:
- n = n 0 + n 1 + n 2 + . . . + n x n=n_0+n_1+n_2+...+n_x n=n0+n1+n2+...+nx
- n − 1 = n 1 + 2 n 2 + 3 n 3 + . . . + x n x n-1=n_1+2n_2+3n_3+...+xn_x n−1=n1+2n2+3n3+...+xnx
第二条等式成立的理由:
左边=边数=总结点n-1
右边=度为0的点往下无边,度为1的结点往下连着一条边,度为2的结点往下连着两条边,度为x的结点往下连着x条边
当该树为二叉树时:
- n = n 0 + n 1 + n 2 , n − 1 = n 1 + 2 n 2 n=n_0+n_1+n_2,n-1=n1+2n_2 n=n0+n1+n2,n−1=n1+2n2 ⇒ \\Rightarrow ⇒ n 0 = n 2 + 1 n_0=n_2+1 n0=n2+1
高度为h的m叉树的最多结点个数n:
n
=
m
h
−
1
m
−
1
n=\\cfrac m^h-1m-1
n=m−1mh−1
m叉树的结点个数为n,最低高度h:
令
n
=
m
h
−
1
m
−
1
n=\\cfrac m^h-1m-1
n=m−1mh−1可得
h
=
log
m
(
n
(
m
−
1
)
)
h=\\log_m(n(m-1))
h=logm(n(m−1))
先中后序非递归遍历
二叉树定义
// Definition for a binary tree node.
struct TreeNode
int val;
TreeNode *left;
TreeNode *right;
TreeNode() : val(0), left(nullptr), right(nullptr)
TreeNode(int x) : val(x), left(nullptr), right(nullptr)
TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right)
;
先序
vector<int> preorderTraversal(TreeNode* root)
TreeNode* p = root;
vector<int>ans;
stack< TreeNode*>sk;
while (p || sk.size())
while JavaScript数据结构学习笔记(封装二叉树)
LeetCode Java刷题笔记—572. 另一棵树的子树