数据结构笔记

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 n1=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,n1=n1+2n2 ⇒ \\Rightarrow n 0 = n 2 + 1 n_0=n_2+1 n0=n2+1

高度为hm叉树的最多结点个数n:
n = m h − 1 m − 1 n=\\cfrac m^h-1m-1 n=m1mh1

m叉树的结点个数为n,最低高度h:
n = m h − 1 m − 1 n=\\cfrac m^h-1m-1 n=m1mh1可得 h = log ⁡ m ( n ( m − 1 ) ) h=\\log_m(n(m-1)) h=logm(n(m1))

先中后序非递归遍历

二叉树定义

// 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. 另一棵树的子树

LeetCode Java刷题笔记—572. 另一棵树的子树

学习笔记:Splay

数据结构与算法笔记(十四)—— 二叉树及二叉树遍历