Oracle FAQ | Your Portal to the Oracle Knowledge Grid |
![]() |
![]() |
Home -> Community -> Usenet -> c.d.o.misc -> Depth first search
I know this sounds silly, but I'm having trouble coding depth-first
search of a tree.
My programming language is Oracle PL/SQL, and I'm reading a cursor, so I only have one record available at a time. The records are presented in pre-order, with the root first, then the root's leftmost child, then its children and so on recursively, the the root's second leftmost child, thens its children and so on recursively, etc. My task is to ensure that, at each level of the tree, an amount stored in each node of the tree is truly the sum of its children, or report an error if it is not. I also check the amount in the leaves of the tree against another table.
Here is my pseudocode:
DECLARE x GLOBAL;
sum := amt; LOOP FETCH x_cursor INTO x; EXIT WHEN endfile(x_cursor) OR x.depth <> depth; IF isleaf(x) THEN assert(x.amt=lookup(x.key),x.key || " fails lookup"); ELSE checktree(x.key,x.amt,x.depth); sum := sum - x.amt; assert(sum=0,"summing error in " || key);
Some sample data is shown below. The key field in x_cursor is indented to show the tree structure; normally, this indention is not present, and I rely on the depth field to follow the levels of the tree. Leaves have six-digit keys; nodes have five-digit keys. This data is correct, and my program should report no errors.
x_cursor lookup key amount depth key amount 10000 2,660,835 0 100010 267,138 10001 355,957 1 100020 88,819 100010 267,138 2 100060 246,891 100020 88,819 2 100070 35,329 11000 374,457 1 111010 39,346 11006 246,891 2 112010 52,891 110060 246,891 3 130001 65,794 110070 35,329 2 130310 168,445 11100 39,346 2 130320 368,276 111010 39,346 3 130331 154,758 11200 52,891 2 130340 178,380 112010 52,891 3 130350 92,575 13000 1,930,421 1 130501 4,000 130001 65,794 2 130511 209,034 13030 962,434 2 130520 108,263 130310 168,445 3 130531 50,470 130320 368,276 3 130550 184,158 13033 154,758 3 130560 124,522 130331 154,758 4 130571 103,589 130340 178,380 3 130900 118,157 130350 92,575 3 13050 784,036 2 130501 4,000 3 13051 209,034 3 130511 209,034 4 130520 108,263 3 13053 50,470 3 130531 50,470 4 130550 184,158 3 130560 124,522 3 13057 103,589 3 130571 103,589 4 130900 118,157 2
Tracing with print statements shows that my code fetches too frequently, getting out of sync with the running totals. There also seem to be problems where the depth decreases by two or more levels. I see what is going wrong, I think, but I don't see how to fix it.
I've been chasing this problem for two days, feeling dumber and dumber by the minute. Please help!
Phil Received on Tue Feb 17 2004 - 14:10:43 CST
![]() |
![]() |