紅黑樹簡單認識

2021-10-02 18:37:09 字數 3505 閱讀 8889

紅黑樹首先是一種樹形結構,同時又是乙個二叉樹(每個節點最多只能有兩個孩子節點,左節點小於等於父節點,右節點大於父節點),為了保證樹的左右孩子樹相對平衡(深度相同),紅黑樹使用了節點標色的方式,將節點標記為紅色或者黑色,在計算樹的深度時只統計黑色節點的數量,不統計紅色節點數量,同時沒有變數高度,增加了父親節點、叔叔節點顏色變數等。

在進行插入和刪除時有可能會觸發紅黑樹的插入平衡調整(balanceinsertion方法)或刪除平衡調整(balancedeletion )方法,調整的方式主要有以下手段:左旋轉(rotateleft方法)、右旋轉(rotateright方法)、顏色反轉,進行調整的原因是為了維持紅黑樹的資料結構。

宣告變數

package edu.xalead.tree.redtree;

import com.sun.org.apache.regexp.internal.re;

import sun.reflect.generics.tree.tree;

public class treenode

public void setparent(treenode parent)

public boolean getcolor()

public void setcolor(boolean color)

public treenode(object data)

public object getdata()

public void setdata(object data)

public treenode getleft()

public void setleft(treenode left)

public treenode getright()

public void setright(treenode right)

}

新增數字所需要的介面

package edu.xalead.tree.redtree;

public inte***ce comp

比較的實體物件  這裡主要是比較年齡 

package edu.xalead.tree.redtree;

public class user implements comp

public int getid()

public void setid(int id)

public int getage()

public void setage(int age)

public string getname()

public void setname(string name)

@override

public int compare(object p)

}

調整樹高度的主方法 

package edu.xalead.tree.redtree;

public class rbtree else

}else if(c.compare(n) == 1)else

}else

return currentnode;

}//調整紅黑樹

private void insertfixup(treenode node)

//叔叔是黑色,且當前節點是右孩子 左旋

if(parent.getright() == node)

//叔叔是黑色,且當前節點是左孩子 右旋

parent.setcolor(treenode.black);

gparent.setcolor(treenode.red);

right_rotate(gparent);

}else

//叔叔是黑色,且當前節點是左孩子 右旋

if(parent.getleft() == node)

//叔叔是黑色,且當前節點是左孩子 左旋

parent.setcolor(treenode.black);

gparent.setcolor(treenode.red);

left_rotate(gparent);}}

// if(this.root.getcolor() == treenode.red)

this.root.setcolor(treenode.black);

}private boolean isred(treenode parent)

private boolean isblack(treenode parent)

private treenode parent(treenode node)

/*** 左旋轉

* a b

* / / \

* b c a

* /

* c

* @param

*/public treenode left_rotate(treenode g)

// 把g的父節點設為p的父節點

p.setparent(g.getparent());

if(g.getparent() == null)elseelse

}//把爺節點設為父節點的左孩子

p.setleft(g);

g.setparent(p);

return p;

}/**

* 右旋轉

* @param g

* @return

*/public treenode right_rotate(treenode g)

// 把g爺節點父節點設為p

p.setparent(g.getparent());

if(g.getparent() == null)elseelse

}//把爺節點設為父節點的右孩子

p.setright(g);

g.setparent(p);

return p;

}public void add(comp data)

else

this.size++;

}public int size()

}

測試

package edu.xalead.tree.redtree;

public class test

}

結果展示: 左旋

右旋

想要對紅黑樹原理進行深切的理解,可以通過除錯跟蹤節點之間的聯絡與變化,也可以在**進行驗證和學習。

紅黑樹的簡單認識(未完工)

紅黑樹,red black tree rbt 是乙個自平衡 不是絕對的平衡 的二叉查詢樹 bst 樹上的每個結點都遵循下面的規則 1.結點是紅色或黑色 2.根節點和葉子結點 nil節點 是黑色 3.每個紅色節點的兩個子節點都是黑色。從每個葉子到根的所有路徑上不能有兩個連續的紅色節點 4.從任一節點到...

簡單理解紅黑樹

前言 在計算機領域,資料的處理能力是非常重要的,查詢作為一種對資料處理乙個很重要的能力,我們就先來看看今天要說的紅黑樹 查詢說到查詢我們很快就能想起來很多常用的查詢方式,比如說遍歷,二分查詢,雜湊等,其中我們知道雜湊在一定情況下可以達到o 1 的時間複雜度,速度可謂是非常之快,但是他也有他的缺點就是...

紅黑樹下 紅黑樹的實現

1.實現紅黑樹的基本思想 實際上,紅黑樹是有固定的平衡過程的 遇到什麼樣的節點分布,我們就對應怎麼去調整。只要按照這些固定的調整規則來操作,就能將乙個非平衡的紅黑樹調整成平衡的。首先,我們需要再來看一下紅黑樹的定義 在插入 刪除節點的過程中,第 三 四點要求可能會被破壞,所以 平衡調整 實際上就是把...