二叉搜索树:搜索性能优秀
binary search tree是一个空树,或者具有以下性质的二叉树,对于树中的每个节点,x。它的左子树中所有关键字的值都小于x的关键字的值,而它的右子树树中的关键字值都大于x的关键字的值。
通常使用二叉链表作为其存储结构。
对其进行中序遍历,可以得到一个关键字有序的序列。因此,对于一个无序序列,可以通过构造一棵二叉搜索树变成一个有序序列,构造树的过程即为对无序序列排序的过程。插入的新的节点都是在叶子节点上,插入的时候,不会移动其它节点,只要改变某个节点的指针,由空变为非空即可。
搜索,插入,删除复杂度等于树高,即O(log(n))
平衡二叉树:
定义:是一颗空树或者左右两个子树高度绝对值不超过1,且左右两颗子树也都是平衡二叉树
给定一下数据结构:判断两个树是否相等。相等返回0,否则返回其它值。
typdef struct TreeNode{ char c; TreeNode *leftchild; TreeNode *rightchild; }
int compareTree(TreeNode *tree1,TreeNode *tree2){ bool isTree1Null=(tree1==NULL); bool isTree2Null=(tree2==NULL); if(isTree1Null!=isTree2Null) return 1; if(isTree1Null && isTree2Null) return 0; if(tree1->c != tree2->c) return 1; return compareTree(tree1->left,tree2->left) && compare(tree1->right,tree2->right); }
比较两个数
红黑二叉树:
普通树转化二叉树记忆技巧:左孩子右兄弟。
查找二叉树:
记忆:左边子树节点(数字)< 父节点 > 右边子树节点(数字)
涉及查找动作,插入动作,删除动作。
哈弗曼树:
路径:也就是线条(1个线条就是1个路径)
权:也就是叶子节点的数字
带权路径长度:路径*权,比如 节点8的为:8*3=24
树的带权路径长度:所有带权路径长度的值相加。哈夫曼树是一种带权路径长度最短的。上面左边41,右边25,哈弗曼是最优的。
构造哈夫曼:比如我们有一组权值{5,29,7,8,14,23,3,11}:
哈夫曼树也是二叉树,所以也是按照二叉树的规则,左小右大。
继续一个一个把这些权值添加到这两颗树上面,从小到大的“堆积”起来,最后形成的大树。看图:
平衡二叉树:对任意一个节点,左右子树深度不超过1. 保持平衡。
LL型平衡旋转:目的就是把普通二叉树给转化成平衡树。
原来是LL ,也就是通过右旋转处理。
RR型通过左旋转处理。
从上面的两个旋转来看,主要是把中间的那个节点作为根结点,然后另外两个结点分别作为左、右子树,就能达到目的。
红黑二叉树:
红-黑二叉树首先是一颗二叉树,它具有二叉树的所有性质,是一种平衡二叉树。