树、二叉树、查找算法总结

一、思维导图

 

 

 

 

 二、重要概念的笔记

二叉树性质

性质1  在二叉树的第 i 层至多有 2^(i -1)个结点。(i>=1)

性质2  深度为 k 的二叉树至多有 2^(k-1)个结点(k >=1)。

性质3  对任何一棵二叉树T, 如果其叶结点数为n0, 度为2的结点数为 n2,则n0=n2+1。

性质4  具有 n (n>=0) 个结点的完全二叉树的深度为+1   

遍历二叉树

先序遍历

 

void Preorder (BiTree T) { 
    if (T) { 
        cout<<T->data;
        //先访问结点
        Preorder(T->lchild);
        Preorder(T->rchild); 
    }
}

 

中序遍历

void Inorder (BiTree T) {
    if (T) { 
        Inorder(T->lchild); 
        cout<<T->data;
                Inorder(T->rchild);
           }
}

后续遍历

void Inorder (BiTree T) {
    if (T) { 
        Inorder(T->lchild); 
        Inorder(T->rchild);
        cout<<T->data;
           }
}

 

 

查找

折半查找的时间复杂度为:O(log2n)。

平衡二叉树

一、平衡二叉树的构造

在一棵二叉查找树中插入结点后,调整其为平衡二叉树。若向平衡二叉树中插入一个新结点后破坏了平衡二叉树的平衡性。首先要找出插入新结点后失去平衡的最小子树根结点的指针。然后再调整这个子树中有关结点之间的链接关系,使之成为新的平衡子树。当失去平衡的最小子树被调整为平衡子树后,原有其他所有不平衡子树无需调整,整个二叉排序树就又成为一棵平衡二叉树

1.调整方法

(1)插入点位置必须满足二叉查找树的性质 ,即任意一棵子树的左结点都小于根结点,右结点大于根结点

(2)找出插入结点后不平衡的最小二叉树 进行调整,如果是整个树不平衡,才进行整个树的调整。

2.调整方式

(1)LL型

LL型:插入位置为左子树的左结点,进行向右旋转

 

 

 

由于在A的左孩子B的左子树上插入结点F,使A的平衡因子由1变为2,成为不平衡的最小二叉树根结点。此时A结点顺时针右旋转,旋转过程中遵循“旋转优先”的规则,A结点替换D结点成为B结点的右子树,D结点成为A结点的左孩子。

(2)RR型

RR型:插入位置为右子树的右孩子,进行向左旋转

 

由于在A的右子树C的右子树插入了结点F,A的平衡因子由-1变为-2,成为不平衡的最小二叉树根结点。此时,A结点逆时针左旋转,遵循“旋转优先”的规则,A结点替换D结点成为C的左子树,D结点成为A的右子树。

(3)LR型

LR型:插入位置为左子树的右孩子,要进行两次旋转,先左旋转,再右旋转;第一次最小不平衡子树的根结点先不动,调整插入结点所在的子树,第二次再调整最小不平衡子树。

 

 

 

 由于在A的左子树B的右子树上插入了结点F,A的平衡因子由1变为了2,成为不平衡的最小二叉树根结点。第一次旋转A结点不动,先将B的右子树的根结点D向左上旋转提升到B结点的位置,然后再把该D结点向右上旋转提升到A结点的位置。

(4)RL型

RL型:插入位置为右子树的左孩子,进行两次调整,先右旋转再左旋转;处理情况与LR类似。

哈夫曼树

  1. 结点的路径长度:从根结点到该结点的路径上分支的数目。

    树的路径长度:树中每个结点的路径长度之和。

    树的带权路径长度(WPL):树中所有叶子结点的带权路径长度之和。

  2. 构造:选取其根结点的权值最小的两棵二叉树,分别作为左、右子树构造一棵新的二叉树,并置这棵新的二叉树根结点的权值为其左、右子树根结点的权值之和。

  3. 哈夫曼编码:关键要设计长度不等的编码,则必须使任一字符的编码都不是另一个字符的编码的前缀,出现频率越大的字符,其哈夫曼编码越短。

哈希表处理冲突

 

 

 

 

 

 三、疑难问题及解决方案

题目:

正确答案

 

posted @ 2020-04-26 21:21  长安某•  阅读(192)  评论(0编辑  收藏  举报