一、 二叉樹(binary tree)
指每個節點最多含有兩個子樹的樹結構。時間復雜度為O(log N),在退化成鏈表的情況下時間復雜度為O(N)。
特點:
1.所有節點最多擁有兩個子節點;
2.節點的左子樹只包含小於當前根節點的數,節點的右子樹只包含大於當前根節點的數。
缺點: 只會以我們第一次添加的節點為根節點,如果后面添加的節點值都大於或小於根節點的值,在這種情況下會退化成鏈表。
二、 平衡二叉樹(Balanced Binary Tree)
又稱為AVL樹,具有二叉樹的全部特性,解決二叉樹退化成鏈表情況的問題,每個節點的左子樹和右子樹的高度之差不會超過1,AVL樹是嚴格的 平衡二叉樹,追求完全平衡,比較嚴格。
缺點: 由於要求每個節點的左子樹和右子樹高度之差不超過1,這個要求非常嚴格,追求完全平衡,這就導致了在頻繁插入和刪除的場景中, 可能就會導致AVL樹失去平衡,AVL樹就需要頻繁的通過左旋右旋使其重新達到平衡,這時就會時得其性能大打折扣。
三、紅黑樹
和AVL樹相比,紅黑樹放棄追求完全平衡,而是追求大致平衡,保證每次插入節點最多只需要三次旋轉就能達到平衡,維持平衡的耗時較少,實現起來也更為簡單,它的旋轉次數較少, 對於頻繁插入和刪除操作的場景,相比AVL樹,紅黑樹更具優勢。
特征:
1.紅黑樹是也是平衡二叉樹實現的一種方式
2.節點只能是黑色或者紅色,root根節點一定是黑色
3.新增時默認新增的節點是紅色,不允許兩個紅色節點相連
4.紅色節點的兩個子節點一定是黑色
紅黑樹變換規則
三種規則:
1.改變節點顏色
2.左旋轉
3.右旋轉
變色的情況:
當前節點的父親節點是紅色,並且它的祖父節點的另外一個子節點(叔叔節點)也是紅色:以當前節點為指針進行操作
1.將父親節點變為黑色
2.將叔叔節點變為黑色
3.將祖父節點變為紅色
4.再把指針定義到祖父節點進行旋轉操作
左旋轉: 當父親節點為紅色情況,叔叔節點為黑色情況,且當前節點是右子樹,左旋轉以父節點作為左旋。
右旋轉: 當父親節點為紅色情況,叔叔節點為黑色情況,且當前節點是左子樹,右旋轉以父節點作為右旋:
1.將父節點變為黑色
2.將祖父節點變為紅色
3.以祖父節點開始旋轉