算法——二叉树

72 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第29天,[点击查看活动详情]

树是n个结点的有限集,当n=0时为空树。树的度是树内个节点的度的最大值。
树的层次:根节点在第一层。深度。
树的存储方式:双亲表示法,孩子表示法,孩子兄弟表示法。
二叉树:度最大为2的树。N=0.空二叉树,null。要分左右.
斜树:所有的结点只有一个方向的二叉树。非平衡树。
满二叉树:除了叶子节点,所有的结点都有左右子树,叶子在同层。平衡二叉树
完全二叉树:二叉树进行层序编号。编号与同样深度的满二叉树编号结点相同。平衡二叉树。叶子结点只能出现在最下两层、相同节点个数的二叉树,完全二叉树的深度最小。
顺序存储结构在极端情况下浪费空间,只适合平衡树的存储。

二叉树的性质

1,在二叉树的第I层上至多有2的i-1次方个结点。
2,深度为k的二叉树至多有2的k次方-1.
3,对于任何一个二叉树,如果终端节点数为n0,度为2的节点数为n2,则n0=n2+1.
4,具有n个结点的完全二叉树的深度为[log2 n]+1.向下取整。
5,对于一棵有n个结点的完全二叉树的结点按层次编序,i=1,结点无双亲,i>1双亲是[i/2];如果2i>n,则结点i无左孩子,否则其左孩子为2i;如果2i+1>n,则结点i无右孩子,否则,右孩子为2i+1;

二叉树的遍历

深度优先DFS

前序遍历:DLR.先根后左最后右结点。
中序遍历:LDR.先左后根最后右结点。
后序遍历:LRD.先左后右最后根结点。

前序遍历:
Function order(Node n){
    if(n==null){
        return;
    }
    Syso(n.data);
    order(n.left);
    order(n.right);
}
中序遍历:
Function order(Node n){
    if(n==null){
        return;
    }
    order(n.left);
    Syso(n.data);
    order(n.right);
}

广度优先BFS

层序遍历:从第一层逐步向下,从左到右。应用:文件遍历。