1. 程式人生 > >資料結構系列之平衡樹(DSW法構建)

資料結構系列之平衡樹(DSW法構建)

1、DSW原理:

DSW法構造平衡樹主要分為兩步,第一步是將一個二叉排序樹通過旋轉變為一個只含右節點的類似單鏈表的樹;第二步是通過旋轉將第一步中的樹轉化為平衡樹。

2、實現

     2.1  實現第一步

<span style="font-size:18px;">    public void creatBackbone(IntBSTNode p,boolean b){
    	IntBSTNode q=p;</span>
<span style="font-size:18px;"></span><pre name="code" class="java"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">              //將所有左子樹旋轉使二叉排序樹不含左子樹</span></span>
while(p.left!=null){
this.rightRotate(p,true); p=root; }
<span style="font-size:18px;">       //  遍歷右子樹,完成右子樹中的左子樹的旋轉操作                            
    	while(p.right!=null){
    		q=p.right;
        	while(q!=null){
        		if(q.left!=null){
        			IntBSTNode s=q.left;
            		this.rightRotate(q, false);
            		p.right=s;
            		q=s.left;
            	}
        		else
        			break;
        	}
			p=p.right;
			q=p.right;	
    	} 	
    }</span>

其中的rightRotate函式如下:
<span style="font-size:18px;">    public void rightRotate(IntBSTNode p,boolean b){        //右旋轉
    		IntBSTNode left=p.left;
			IntBSTNode rightchild=left.right;
			p.left=rightchild;
			left.right=p;
			if(b)
				root=left;
    }</span>

     2.2  實現第二步

     (暫時還不會,等待更新。。。)

3、測試

      3.1、對第一步的測試

<span style="font-size:18px;">package 二叉樹;

import 元素排序演算法.Sort;

public class Test {

	public static void main(String[] args) {
		IntBST i=new IntBST();
		Sort s=new Sort();
		i.insert(2);
		i.insert(0);
		i.insert(7);
		i.insert(-12);
		i.insert(1);
		i.insert(4);
		i.insert(8);
		System.out.println("普通二叉排序樹的廣度優先遍歷:");
		i.breadthFirst();
		System.out.println();
		i.creatBackbone(i.root,true);
		System.out.println("呼叫creatBackbone後的廣度優先遍歷:");
		i.breadthFirst();
	}
}</span>

4、結果:
<span style="font-size:18px;">普通二叉排序樹的廣度優先遍歷:
2 0 7 -12 1 4 8 
呼叫creatBackbone後的廣度優先遍歷:
-12 0 1 2 4 7 8 </span>