Red Ebony <Black Heights> (Redraft)
/** 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()); } }
This is a rework, do you think it will work, I tested it under certain conditions and how I have not succeeded yet
source share
As far as I can tell, you are only checking the black height on the leftmost and rightmost path through the tree. The definition of mahogany-ebony requires that the height of the black is the same on all paths. For example, this invalid tree is not flagged by your program:
B / \ / \ / \ B B / \ / \ B R R B
Also, it doesn't check for loops or keys are ok.
source share
So I understand that you are working in java here, but there is some pseudocode here that might help:
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
I'm just starting to experiment with red black trees myself, but I believe this algorithm should give you a black height at whatever node you call.
Edit: I am assuming that I have to qualify, this will be the code found inside a node not inside a tree. In C ++ it will be called with someNode-> blackHeight ().
source share
//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); }
source share