難度:3
描述什麼是紅黑樹呢?顧名思義,跟棗樹類似,紅黑樹是一種葉子是黑色果子是紅色的樹。。。
當然,這個是我說的。。。
《演算法導論》上可不是這麼說的:
如果乙個二叉查詢樹滿足下面的紅黑性質,那麼則為乙個紅黑樹。
1)每個節點或是紅的,或者是黑的。
2)每個葉子節點(nil)是黑色的
3)如果乙個節點是紅色的,那麼他的兩個兒子都是黑的。
4)根節點是黑色的。
5)對於每個節點,從該節點到子孫節點的所有路徑上包含相同數目的黑色節點。
我們在整個過程中會用到這些性質,當然,為了公平起見,其實即使你不知道這些性質,這個題目也是可以完成的(為什麼不早說。。。。)。在紅黑樹的各種操作中,其核心操作被稱為旋轉,那麼什麼是旋轉呢,我們來看乙個例子:
假設我們這裡擷取紅黑樹的一部分,放在左邊,通過操作如果可以把他轉化為右邊的形式,那麼我們就稱將根為x的子樹進行了左旋,反之我們稱將根為y的樹進行了右旋:
恰好慢板同學把自己紅黑樹弄亂了,然後請你幫忙進行修復,他將向你描述他的紅黑樹(混亂的。。。)。然後告訴他需要用哪種方式旋轉某個節點。在你完成工作之後,直接向大黃提交新的樹的中序遍歷結果就好了。
hint:
在這裡好心的慢板同學給你簡單的解釋下樣例:
最開始的時候樹的樣子是這樣的:
1 2
然後對於標號為0的節點進行右旋,結果將變為:
然後呢。。。
中序遍歷?這個是什麼東西,哪個人可以告訴我下。。。。
輸入輸入分兩部分: 第一部分:乙個整數t(1<=t<=10),表示測試的組數。 第二部分:第一行是乙個數字n,表示紅黑樹的節點個數。0輸出
每組測試返回n行數字,表示對樹的中序遍歷。在每組測試資料之後留一行空行。
樣例輸入
1樣例輸出30 1 2
1 -1 -1
2 -1 -1
10 1
102題解:就是中序輸出二叉樹,旋轉跟中序表示式沒有影響;
**;
#include#include#include
#include
#include
using
namespace
std;
class
node
intgetl()
intgetr()
void
get()
};node dt[
10];
void visit(int
root)
intmain()
visit(0);
scanf("%d
", &n);
while(n--)
}return0;
}
紅黑樹(中序二叉樹)
時間限制 難度 3 描述 什麼是紅黑樹呢?顧名思義,跟棗樹類似,紅黑樹是一種葉子是黑色果子是紅色的樹。當然,這個是我說的。演算法導論 上可不是這麼說的 如果乙個二叉查詢樹滿足下面的紅黑性質,那麼則為乙個紅黑樹。1 每個節點或是紅的,或者是黑的。2 每個葉子節點 nil 是黑色的 3 如果乙個節點是紅...
二叉樹 紅黑樹
也就是說,二叉排序樹中,左子樹都比節點小,右子樹都比節點大,遞迴定義。根據二叉排序樹這個特點我們可以知道,二叉排序樹的中序遍歷一定是從小到大的,比如上圖,中序遍歷結果是 1 3 4 6 7 8 10 13 14 效能取決於 public class demo public static void m...
紅黑二叉樹
紅黑二叉樹 紅黑二叉樹的基本思想是想用標準的二叉查詢樹 完全由2 結點構成 和一些額外的資訊 替換3 結點 來表述2 3樹。或者說,我們將3 結點表示為由一條左斜的紅色鏈結相 兩個2 結點其中之一是另乙個的左子節點 連的兩個2 結點。這種表示的優點 我們無需修改就可以直接使用標準二叉查詢樹的get ...