查找二叉树
查找二叉树规定:
左孩子(子树)小于根节点
右孩子(子树)大于根节点
子树中此规则仍然存在
例
下图中:
左子树所有值均小于根节点90;右子树值大于根节点90;
以49为根节点的左子树中,左子树的值20,小于左子树中的根节点49;
以49为根节点的左子树中,右子树的值,56、51均大于左子树根节点49;
以49为根节点的左子树中,以56为根节点的右子树中的左子树的值51小于根节点56
查找二叉树构造的意义
查找二叉树又称排序二叉树,构造的意义是可以极大的提高查询的速率。
例如下图中:
如果我想查找56
顺序存储中需要定位到头部一步步往后查;
查找二叉树中,首先比较56与根节点90的大小,小于89直接去以49为根的左子树。
比较56与49的大小,大于49直接去以49为根节点的右子树。
查到结果。
插入结点
①若该键值已存在,则不再插入,查找二叉树中不允许存在大小相等的值;
例如:想要插入20,但是树中20已存在则不再插入。
②若查找二叉树为空树,则以新结点为查找二叉树;
例如:查找二叉树中一个数值也没有,那么这个新插入的值就是二叉树。
③将需要插入的节点键值与父结点键值进行比较,如果大于父节点则插入右子树,小于父结点则插入左子树;
删除结点
①若删除结点为叶子结点,则直接删除;
例如:结点51为叶子结点,想要删除直接删除就可。
②若删除的结点只有一个子节点,则直接将这个子节点与删除结点的父节点连接;
例如:删除结点56,56只有一个子节点51,56的父节点是49,如果删除56,则需要将结点49与结点51连接。
③若删除的结点有两个子节点,则在其左子树上用中序遍历寻找最大的值,用最大的值代替删除节点,然后将最大的值原本所在的位置删除,再根据①、②中的规则处理最大值的子节点。
例如:删除树中的90,首先在其左子树即以49为根节点的子树之中寻找最大值,最大值为56,用56代替90,然后将56的子节点51按照上述①、②中的规则处理,即将节点51连接到节点49上。
平衡二叉树
同样的数字序列,所构成的排序二叉树可能有多种不同情况,但是往往二叉树的构造越平衡,查找速度越快,因此提出平衡二叉树的概念。
例:
数字序列:1、5、7、8、9、39、73、88可构造而成多种不同的二叉树。右侧二叉树的构造比左侧二叉树的构造更平衡,因此右侧二叉树的查找速度要快于左侧。
平衡二叉树的定义
判断一棵二叉树是不是平衡二叉树下面①②条件缺一不可。
①任意节点的左右子树深度相差不超过1。
下图中二叉树的左子树深度为5,没有右子树即右子树深度为0,其左右子树的深度差值为5,超过1,所以不是平衡二叉树。
下图中二叉树的左子树深度为3,右子树深度为 2,左右子树的深度差值为1符合平衡二叉树标准故为平衡二叉树。
②二叉树的每个节点的平衡度只能是-1、0、1。
每个结点的平衡度是该结点的左子树深度减去该结点的右子树深度。
下图中不满足每个结点的平衡度只为-1、0、1,故不是平衡二叉树。
下图中满足每个结点的平衡度只为-1、0、1,故是平衡二叉树。