查找
排序
树寻找前驱算法
class Solution {public void flatten(TreeNode root) {TreeNode curr = root;while (curr != null) {if (curr.left != null) {TreeNode next = curr.left;TreeNode predecessor = next;while (predecessor.right != null) {predecessor = predecessor.right;}predecessor.right = curr.right;curr.left = null;curr.right = next;}curr = curr.right;}}}
Morris遍历
用于实现二叉树的遍历,节省内存空间,利用叶节点的左右孩子指向遍历的钱去或者后驱的节点,指针叫做线索,实现线索二叉树
前序遍历:根结点 —-> 左子树 —-> 右子树
中序遍历:左子树—-> 根结点 —-> 右子树
后序遍历:左子树 —-> 右子树 —-> 根结点
中序遍历流程
- 当前节点左孩子是否为空,是则输出当前节点,更新当前节点为前节点的右孩子,否则进入2;
在当前节点的柚子树中寻找中序遍历下的前驱节点,(左子树的最右节点)
- 若前驱节点右孩子为空则将前驱节点的右孩子指向当前节点,当前节点更新为左孩子
- 若前驱节点的右孩子为当前节点(不为空),则将前驱节点的
cur = rootrepeat until cur != NULL:if cur.left != NULL:pre = cur.left;while pre.right == NULL && pre.right != cur://找到前驱结点prepre = pre.rightif pre.right == NULL:pre.right = curcur = cur.leftelse:print(cur)pre.right = NULLcur = cur.rightelse:print(cur)cur = cur.right
前序遍历流程
当前结点的左孩子是否为空,若是则输出当前结点,并更新当前结点为当前结点的右孩子;否则进入2;
- 在当前结点的左子树中寻找中序遍历下的前驱结点(左子树中最右结点)
a. 若前驱结点的右孩子为空,则将前驱结点的右孩子指向当前结点,输出当前结点(在这里输出,和中序遍历不同的地方),当前结点更新为当前结点的左孩子;进入3;
b. 若前驱结点的右孩子为当前结点(不为空),将前驱结点的右孩子置NULL,当前结点更新为当前结点的右孩子,进入3;
cur = root;repeat until cur != NULL:if cur.left != NULL:pre = cur.left;while pre.right == NULL && pre.right != cur://找到前驱结点prepre = pre.rightif pre.right == NULL:pre.right = curprint(cur)//此处和中序遍历不同cur = cur.leftelse:pre.right = NULLcur = cur.rightelse:print(cur)cur = cur.right
后序遍历流程
- 新建一个Dummy结点,该结点的左孩子指向树根root,将Dummy作为当前结点;
- 当前结点的左孩子是否为空,更新当前结点为当前结点的右孩子;否则进入2;
- 在当前结点的左子树中寻找中序遍历下的前驱结点(左子树中最右结点):
a. 若前驱结点的右孩子为空,则将前驱结点的右孩子指向当前结点,当前结点更新为当前结点的左孩子,进入3;
b. 若前驱结点的右孩子为当前结点(不为空),反转当前结点到前驱结点之间的路径,输出该路径所有结点;反转当前结点到前驱结点之间的路径,恢复原状。将前驱结点的右孩子置NULL,当前结点更新为当前结点的右孩子;
public class Singleton {private volatile static Singleton singleton;private Singleton (){}public static Singleton getSingleton() {if (singleton == null) {synchronized (Singleton.class) {if (singleton == null) {singleton = new Singleton();}}}return singleton;}}
查并集
/* 并查集模板 */class UnionFind {public:vector<int> parent;vector<int> size;int n;// 当前连通分量数目int setCount;public:UnionFind(int _n): n(_n), setCount(_n), parent(_n), size(_n, 1) {iota(parent.begin(), parent.end(), 0); /* 赋值0-n-1 */}int findset(int x) {return parent[x] == x ? x : parent[x] = findset(parent[x]);}bool unite(int x, int y) {x = findset(x);y = findset(y);if (x == y) {return false;}if (size[x] < size[y]) {swap(x, y);}parent[y] = x;size[x] += size[y];--setCount;return true;}bool connected(int x, int y) {x = findset(x);y = findset(y);return x == y;}};
