二叉树平衡(DSW算法)

一、前言

《二叉查找树全面详细介绍》中讲解了二叉树操作:搜索(查找)、遍历、插入、删除。《二叉树遍历详解(递归遍历、非递归栈遍历,Morris遍历)》详细讲解了二叉树遍历的几种方法。《二叉树平衡(有序数组创建)》通过了一种构建平衡二叉树的方法

《二叉树平衡(有序数组创建)》讨论的算法的效率有点低,因为在创建完全平衡的树之前,需要使用一个额外的有序数组。为了避免排序,这一算法需要破坏树并用中序遍历把元素放在数组中,然后重建该树,这样做效率并不高,除非树很小。然而,存在几乎不需要存储中间变量也不需要排序过程的算法。Colin Day提出了非常简洁的DSW算法,Quentin F. Stout以及Bette L. Waren 对此算法进行了改进,本文讲解DSW算法构建平衡二叉树(完全平衡二叉树)。

 

二、知识点回顾

2.1 二叉树的旋转

有两种旋转方法:

(1)左旋转:将根节点旋转到(根节点的)右孩子的左孩子位置

(2)右旋转:将根节点旋转到(根节点的)左孩子的右孩子位置

下图为左、右旋转图,黄色节点为旋转的根节点,灰色节点是可以有也可以没有的节点。

 

三、DSW算法(Day–Stout–Warren algorithm)

一般来说,DSW算法首先将任意的二叉查找树转换为类似于链表的树,称为主链或主干。然后围绕主链中第二个节点的父节点,反复将其旋转,将这棵被拉伸的树在系列步骤中转换成完全平衡的树。DSW算法可以分为两个大的步骤。

步骤一:将二叉树右旋转形成主链;

步骤二:左旋转转换为平衡树;

其中步骤二可以分为两个阶段:

阶段一:左旋n-m次

阶段二:进入循环根据每一层节点数进行旋转。

3.1 步骤一

createBackbone (root)
    tmp = root;
    while (tmp !=0)
        if tmp有左子节点
        	围绕tmp旋转该子节点: //这样该左子节点将成为tmp的父节点
    	tmp设置为刚刚成为父节点的子节点;
     else 将tmp设置为它的右子节点:

步骤一实例演示:

 

3.2 步骤二

createPerfectTree ()
    n=节点数;
    m = (1 << (int)log2(n)) - 1; //计算当前节点数n与最接近完全平衡二叉树中节点数之间的差,多出的节点将单独处理
    // 第一阶段:进行左旋m-n次
    
    // 第二阶段:进入循环根据每一层节点数进行左旋转
    while (m> 1)
        m=m/2;
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值