最近在复习数据结构,看到BST的时候遇到了问题,就是当删除或增加树中节点时,要求保证树的高度平衡行,也就是使BST成为AVL。
成都创新互联服务项目包括岐山网站建设、岐山网站制作、岐山网页制作以及岐山网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,岐山网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到岐山省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!后来看了很多资料,说LL、RR、LR、RL啥的,没看懂。之后经过和同学研究发现了一个特性,就是offending node与其回溯路径上的最近的两个点有大小关系。
如上图,一个空BST树,插入16到树中,由于是空树,那么16就作为根节点。之后再输入3。3比16小,放在16的左边作为左子节点,再输入7,7比16小,走左子树一边,然后7再和3相比较,7比3大,走3的右子树。但是如上图所示,这不是一棵AVL树,因为16的左子树高度为2,右子树高度为0,左右高度差的绝对值为2,超过了AVL的条件:左右高度绝对差<2。那么就需要“旋转子树”以保证其AVL特性。
看了很多书,都说什么左旋转啊右旋转啊,像上图这种情况还比较复杂,需要先左旋转后右旋转。
其实,经过这些天的研究发现,以上图为例,当节点7进入树之后,打破了平衡,那么就从节点7开始回溯找到offending node,也就是节点16。然后选择offending node与回溯路径上的距离节点16的最近的两个node,也就是节点3和7。这三个点选取之后,对三个点进行大小比较,找出最小、大和中间节点,比如16、3、7三个节点的按大小排序后的顺序是3、7、16。然后中间的节点(节点7)作为新树的根,其左节点是最小节点,右节点是大节点,然后将新树接回原来的树上。