树、二叉树、查找算法总结
一、思维导图
二、重要概念的笔记
二叉树性质
性质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类似。
哈夫曼树
-
结点的路径长度:从根结点到该结点的路径上分支的数目。
树的路径长度:树中每个结点的路径长度之和。
树的带权路径长度(WPL):树中所有叶子结点的带权路径长度之和。
-
构造:选取其根结点的权值最小的两棵二叉树,分别作为左、右子树构造一棵新的二叉树,并置这棵新的二叉树根结点的权值为其左、右子树根结点的权值之和。
-
哈夫曼编码:关键要设计长度不等的编码,则必须使任一字符的编码都不是另一个字符的编码的前缀,出现频率越大的字符,其哈夫曼编码越短。
哈希表处理冲突
三、疑难问题及解决方案
题目:
正确答案