Red Black Tree (Redraft)
-
05-09-2019 - |
Domanda
/** The following function checks the red black tree black height
* @param n the root node is inputed then a traversal is done to calculate the black-height
* @return Return an error message / mesages informing the user whether or not the black height was maintained
* @author Ferron Smith
*/
public static void getCount (SkaRedBlackTreeNode skaRedBlackTreeNode) {
VizRedBlackTreeNode n = skaRedBlackTreeNode.getVizRep();
if (validRoot(n))
{
static int lcount = leftCount(n);
static int rcount = rightCount(n);
if (rcount == lcount) {
n.displayMsg("Black height maintained");
}
else
// n.displayWarning("rcount " + rcount + " lcount " + lcount);
n.displayError("Red Black Tree is unbalanced");
}
}
/** The following function counts all the black node of the left side of the tree
* @param n the left child is inputed and a traversal is done to count all the black nodes
* */
public static int leftCount (VizRedBlackTreeNode n)
{
if (n == null)
return 0;
else if (n.getrbtColr() == Color.black)
return 1 + leftCount(n.getLeft());
else
leftCount(n.getLeft());
}
/** The following function counts all the black node of the right side of the tree
* @param n the right child is inputed and a traversal is done to count all the black nodes
* */
public static int rightCount (VizRedBlackTreeNode n)
{
if (n == null)
return 0;
else if (n.getrbtColr() == Color.black) {
return 1 + rightCount (n.getRight());
else
rightCount(n.getRight());
}
}
Questa è riformulare, pensi che questo funziona, ho provato a determinate condizioni e come non ancora mi fallito
Soluzione
Per quanto posso dire, si sta controllando l'altezza nero solo sulle più a sinistra e più a destra percorsi verso il basso l'albero. La definizione di un albero rosso-nero richiede che l'altezza nera sia la stessa su tutti i percorsi . Ad esempio, questo albero non valido non viene valutato dal programma:
B
/ \
/ \
/ \
B B
/ \ / \
B R R B
Inoltre, esso non controlla per cicli o se le chiavi sono in ordine.
Altri suggerimenti
Così mi rendo conto che si sta lavorando in Java qui, ma ecco qualche pseudocodice che può aiutare:
unsigned int blackHeight()
height, heightLeft, heightRight = 0
if black
height++
if left
heightLeft = left->blackHeight()
else
heightLeft = 1
if right
heightRight = right->blackHeight()
else
heightRight = 1
if heightLeft != heightRight
//YOU HAVE A PROBLEM!
height += heightLeft
return height
sto appena iniziando a sperimentare con alberi neri rossi me, ma credo che questo algoritmo dovrebbe darvi l'altezza nera su qualsiasi nodo si chiama da.
Edit: Credo che dovrebbe beneficiare, questo codice potrebbe essere trovato all'interno di un nodo non all'interno dell'albero. In C ++ si sarebbe chiamato con un someNode-> blackHeight ().
//enter code here
private static void blackHeight(rbnode root) {
if (root == null)
return;
if (root.color == "black") {
root.black_count = root.parent.black_count+1;
} else {
root.black_count = root.parent.black_count;
}
if ((root.left == null) && (root.right == null)) {
bh = root.black_count;
}
blackHeight(root.left);
blackHeight(root.right);
}