面试攻略二(数据结构专题)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_28202661/article/details/81839575

二叉树简介

  • 性质1:在非空二叉树的i层上,至多有2^{k-1}个节点(k>=1)。

    性质2:深度为k的二叉树最多有2^{k}-1个结点(k≥1)。(由性质1,通过等比数列求和可证)

    性质3:一棵二叉树的叶子结点数为n0,度为2的结点数为n2,则n0 = n2 + 1。

    性质4:具有n个结点的完全二叉树的深度为floor(log2n) + 1 。

    性质5:如果对一棵有n个结点的完全二叉树(其深度为floor(log2n) + 1 )的结点按层序编号,则对任一结点i(1≤i≤n)有:

    (1) 如果i = 1,则结点i是二叉树的根,无双亲;如果i > 1,则其双亲PARENT(i)是结点 floor((i)/2)。

    (2)如果2i > n,则结点i无左孩子;否则其左孩子LCHILD(i)是结点2i。

    (3)如果2i + 1 > n,则结点i无右孩子;否则其右孩子RCHILD(i)是结点2i + 1。

附:浅谈数据结构-二叉树

的遍历规则(前序遍历、后序遍历、中序遍历)

树的遍历顺序大体分为三种:前序遍历(先根遍历、先序遍历),中序遍历(中根遍历),后序遍历(后根遍历)。

如图所示二叉树:

前序遍历:前序遍历可以记为根左右,若二叉树为空,则结束返回。

前序遍历的规则:

(1)访问根节点

(2)前序遍历左子树

(3)前序遍历右子树

这里需要注意:在完成第2,3步的时候,也是要按照前序遍历二叉树的规则完成。

前序遍历的输出结果:ABDECF

中序遍历:中序遍历可以记为左根右,也就是说在二叉树的遍历过程中,首先要遍历二叉树的左子树,接着遍历根节点,最后遍历右子树。

同样,在二叉树为空的时候,结束返回。

中序遍历的规则:

(1)中序遍历左子树

(2)访问根节点

(3)中序遍历右子树

注意:在完成第1,3步的时候,要按照中序遍历的规则来完成。

中序遍历的输出结果:DBEAFC

后序遍历:后序遍历可以记为左右根,也就是说在二叉树的遍历过程中,首先按照后序遍历的规则遍历左子树,接着按照后序遍历的规则遍历右子树,最后访问根节点。

在二叉树为空的时候,结束返回。

后序遍历二叉树的规则:

(1)后序遍历左子树

(2)后序遍历右子树

(3)访问根节点

注意:在完成1,2步的时候,依然要按照后序遍历的规则来完成。

后序遍历的输出顺序:DEBFCA

二叉树还原

构造哈弗曼树

附:构造哈夫曼树

红黑树

  1. 每个节点要么是红色,要么是黑色。
  2. 根节点必须是黑色
  3. 红色节点不能连续(也即是,红色节点的孩子和父亲都不能是红色)。
  4. 对于每个节点,从该点至null(树尾端)的任何路径,都含有相同个数的黑色节点。

左旋:右子树逆时针掉左

TreeMap_rotateLeft.png

右旋:左子树顺时针掉右

TreeMap_rotateRight.png

史上最清晰的红黑树讲解(上)

史上最清晰的红黑树讲解(下)

Dijkstra算法简介

详情参考:最短路径问题---Dijkstra算法详解

网络最大流图

从源点到汇点
按顺序能走的下一步都画上(仅一步)
到过的点不再走
直到汇点构成一条可增广路
从汇点往前推到源点就绘制出路径
其中可增d=分段路径中权最小值
随后在图中绘制出的增广路径每段-d
(若<=0则直接擦除)
再随后沿着擦除前的可增广路径每段反向+d

就这样一直找啊找到源点再也出不来了或者汇点再也达不到了就停止
那么此时最短路长度就是d1+d2+…(通过实流图也可以看出来)

附:网络流最大流的原理图解

猜你喜欢

转载自blog.csdn.net/qq_28202661/article/details/81839575