代码实现
节点实现类
package csdn. dreamzuora. tree;
public interface Node {
}
package csdn. dreamzuora. tree; import java. io. Serializable;
public abstract class AbstractNode < T, E> implements Node , Serializable { private static final long serialVersionUID = - 2321782309212147194 L; T data; E left; E right; public AbstractNode ( ) { } public AbstractNode ( T data) { this . data = data; } public T getData ( ) { return data; } public void setData ( T data) { this . data = data; } public E getLeft ( ) { return left; } public void setLeft ( E left) { this . left = left; } public E getRight ( ) { return right; } public void setRight ( E right) { this . right = right; }
}
package csdn. dreamzuora. tree;
public class RedBlackNode extends AbstractNode < Integer, RedBlackNode> { boolean isBlack; RedBlackNode parent; public RedBlackNode ( Integer data) { super ( data) ; this . isBlack = false ; } public boolean isBlack ( ) { return isBlack; } public void setBlack ( boolean black) { isBlack = black; } public RedBlackNode getParent ( ) { return parent; } public void setParent ( RedBlackNode parent) { this . parent = parent; } @Override public String toString ( ) { return "RedBlackNode{" + "isBlack=" + isBlack + ", data=" + data + '}' ; }
}
红黑树实现
package csdn. dreamzuora. tree; import java. util. List;
public interface Tree < T, E> { void createTree ( List< T> dataList) ; E addNode ( E tree, T data) ; void deleteNode ( E tree, E node) ; void preOrder ( List< T> list, E node) ; void inOrder ( List< T> list, E node) ; void laOrder ( List< T> list, E node) ; void bfs ( List< T> list, E node) ; }
package csdn. dreamzuora. tree; import java. io. Serializable;
import java. util. List;
public abstract class AbstractTree < T, E> implements Tree < T, E> , Serializable { private static final long serialVersionUID = - 8046156919125106629 L; E root; @Override public void createTree ( List< T> dataList) { for ( T data : dataList) { addNode ( root, data) ; } } void addNode ( T data) { } ; }
package csdn. dreamzuora. tree; import java. util. LinkedList;
import java. util. List;
public class RedBlackTree extends AbstractTree < Integer, RedBlackNode> { @Override public void createTree ( List< Integer> dataList) { for ( Integer data : dataList) { addNode ( data) ; } } @Override public void addNode ( Integer data) { RedBlackNode node = new RedBlackNode ( data) ; if ( root == null) { node. setBlack ( true ) ; root = node; return ; } RedBlackNode parent = root; RedBlackNode son = null; if ( data <= parent. getData ( ) ) { son = parent. getLeft ( ) ; } else { son = parent. getRight ( ) ; } while ( son != null) { parent = son; if ( data <= parent. getData ( ) ) { son = parent. getLeft ( ) ; } else { son = parent. getRight ( ) ; } } if ( data <= parent. getData ( ) ) { parent. setLeft ( node) ; } else { parent. setRight ( node) ; } node. setParent ( parent) ; balance ( node) ; } @Override public RedBlackNode addNode ( RedBlackNode tree, Integer data) { return null; } private void balance ( RedBlackNode node) { RedBlackNode father; RedBlackNode grandFather; while ( ( father = node. getParent ( ) ) != null && father. isBlack ( ) == false ) { grandFather = father. getParent ( ) ; if ( grandFather. getLeft ( ) == father) { RedBlackNode uncle = grandFather. getRight ( ) ; if ( uncle != null && uncle. isBlack ( ) == false ) { father. setBlack ( true ) ; uncle. setBlack ( true ) ; grandFather. setBlack ( false ) ; node = grandFather; continue ; } if ( node == father. getRight ( ) ) { leftRotate ( father) ; RedBlackNode temp = node; node = father; father = temp; } father. setBlack ( true ) ; grandFather. setBlack ( false ) ; rightRotate ( grandFather) ; } else { RedBlackNode uncle = grandFather. getLeft ( ) ; if ( uncle != null && uncle. isBlack ( ) == false ) { father. setBlack ( true ) ; uncle. setBlack ( true ) ; grandFather. setBlack ( false ) ; node = grandFather; continue ; } if ( node == father. getLeft ( ) ) { rightRotate ( father) ; RedBlackNode temp = node; node = father; father = temp; } father. setBlack ( true ) ; grandFather. setBlack ( false ) ; leftRotate ( grandFather) ; } } root. setBlack ( true ) ; } public void leftRotate ( RedBlackNode node) { RedBlackNode right = node. getRight ( ) ; RedBlackNode parent = node. getParent ( ) ; if ( parent == null) { root = right; right. setParent ( null) ; } else { if ( parent. getLeft ( ) != null && parent. getLeft ( ) == node) { parent. setLeft ( right) ; } else { parent. setRight ( right) ; } right. setParent ( parent) ; } node. setParent ( right) ; node. setRight ( right. getLeft ( ) ) ; if ( right. getLeft ( ) != null) { right. getLeft ( ) . setParent ( node) ; } right. setLeft ( node) ; } private void rightRotate ( RedBlackNode node) { RedBlackNode left = node. getLeft ( ) ; RedBlackNode parent = node. getParent ( ) ; if ( parent == null) { root = left; left. setParent ( null) ; } else { if ( parent. getLeft ( ) != null && parent. getLeft ( ) == node) { parent. setLeft ( left) ; } else { parent. setRight ( left) ; } left. setParent ( left) ; } node. setParent ( left) ; node. setLeft ( left. getRight ( ) ) ; if ( left. getRight ( ) != null) { left. getRight ( ) . setParent ( node) ; } left. setRight ( node) ; } @Override public void deleteNode ( RedBlackNode root, RedBlackNode node) { } @Override public void preOrder ( List< Integer> showList, RedBlackNode node) { if ( node == null) { return ; } if ( node. getLeft ( ) == null && node. getRight ( ) == null) { showList. add ( node. getData ( ) ) ; return ; } showList. add ( node. getData ( ) ) ; preOrder ( showList, node. getLeft ( ) ) ; preOrder ( showList, node. getRight ( ) ) ; } @Override public void inOrder ( List< Integer> showList, RedBlackNode node) { if ( node == null) { return ; } if ( node. getLeft ( ) == null && node. getRight ( ) == null) { showList. add ( node. getData ( ) ) ; return ; } inOrder ( showList, node. getLeft ( ) ) ; showList. add ( node. getData ( ) ) ; inOrder ( showList, node. getRight ( ) ) ; } @Override public void laOrder ( List< Integer> showList, RedBlackNode node) { if ( node == null) { return ; } if ( node. getLeft ( ) == null && node. getRight ( ) == null) { showList. add ( node. getData ( ) ) ; return ; } laOrder ( showList, node. getLeft ( ) ) ; laOrder ( showList, node. getRight ( ) ) ; showList. add ( node. getData ( ) ) ; } @Override public void bfs ( List< Integer> list, RedBlackNode node) { if ( node == null) { return ; } LinkedList< RedBlackNode> queue = new LinkedList < > ( ) ; queue. offer ( node) ; while ( ! queue. isEmpty ( ) ) { RedBlackNode child = queue. poll ( ) ; list. add ( child. data) ; if ( child. left != null) { queue. offer ( child. left) ; } if ( child. right != null) { queue. offer ( child. right) ; } } }
}
单元测试
package csdn. dreamzuora. tree; import org. junit. Before;
import org. junit. Test;
import org. junit. jupiter. api. Assertions; import java. util. ArrayList;
import java. util. Arrays;
import java. util. List; import static org. junit. Assert. *;
public class RedBlackTreeTest { RedBlackTree RBtree = new RedBlackTree ( ) ; @Before public void init ( ) { List< Integer> list = Arrays. asList ( 10 , 5 , 9 , 3 , 6 , 7 , 19 , 32 , 24 , 17 ) ; RBtree. createTree ( list) ; } @Test public void addNode ( ) { } @Test public void deleteNode ( ) { } @Test public void preOrder ( ) { List< Integer> actualList = new ArrayList < > ( ) ; RBtree. preOrder ( actualList, RBtree. root) ; List< Integer> expectList = Arrays. asList ( 9 , 5 , 3 , 6 , 7 , 19 , 10 , 17 , 32 , 24 ) ; Assertions. assertEquals ( expectList, actualList) ; } @Test public void inOrder ( ) { List< Integer> actualList = new ArrayList < > ( ) ; RBtree. inOrder ( actualList, RBtree. root) ; List< Integer> expectList = Arrays. asList ( 3 , 5 , 6 , 7 , 9 , 10 , 17 , 19 , 24 , 32 ) ; Assertions. assertEquals ( expectList, actualList) ; } @Test public void laOrder ( ) { List< Integer> actualList = new ArrayList < > ( ) ; RBtree. laOrder ( actualList, RBtree. root) ; List< Integer> expectList = Arrays. asList ( 3 , 7 , 6 , 5 , 17 , 10 , 24 , 32 , 19 , 9 ) ; Assertions. assertEquals ( expectList, actualList) ; } @Test public void bfs ( ) { List< Integer> actualList = new ArrayList < > ( ) ; RBtree. bfs ( actualList, RBtree. root) ; List< Integer> expectList = Arrays. asList ( 9 , 5 , 19 , 3 , 6 , 10 , 32 , 7 , 17 , 24 ) ; Assertions. assertEquals ( expectList, actualList) ; } @Test public void leftRotate ( ) { } @Test public void rightRotate ( ) { RedBlackNode node5 = new RedBlackNode ( 5 ) ; RedBlackNode node3 = new RedBlackNode ( 3 ) ; RedBlackNode node8 = new RedBlackNode ( 8 ) ; RedBlackNode node7 = new RedBlackNode ( 7 ) ; RedBlackNode node9 = new RedBlackNode ( 9 ) ; RBtree. root = node5; RBtree. root. left = node3; node8. left = node7; node8. right = node9; RBtree. root. right = node8; RBtree. leftRotate ( RBtree. root) ; }
}