Binary Tree - Counting nodes on a level

前端 未结 1 1144
既然无缘
既然无缘 2020-12-11 07:03

I\'m writing a binary tree class, and I\'m stuck on a levelCount method, where I need to count the number of nodes on a level of the tree. The class and method look somethi

相关标签:
1条回答
  • 2020-12-11 07:28

    Here's the general approach.

    You traverse the tree exactly as you would normally (depth-first, in-order) but you simply pass down the desired and actual level as well, with pseudo-code such as:

    def getCountAtLevel (node, curr, desired):
        # If this node doesn't exist, must be zero.
        if node == NULL: return 0
    
        # If this node is at desired level, must be one.
        if curr == desired: return 1
    
        # Otherwise sum of nodes at that level in left and right sub-trees.
        return getCountAtLevel (node.left,  curr+1, desired) +
               getCountAtLevel (node.right, curr+1, desired)
    
    #######################################################################
    # Get number of nodes at level 7 (root is level 0).
    nodesAtLevel7 = getCountAtLevel (rootNode, 0, 7)
    

    It doesn't actually traverse the entire tree since, once it gets to the desired level, it can just ignore everything underneath that. Here's a complete C program that shows this in action:

    #include <stdio.h>
    
    typedef struct _sNode { struct _sNode *left, *right; } tNode;
    
    // Node naming uses (t)op, (l)eft, and (r)ight.
    tNode TLLL = {NULL,  NULL    }; // level 3
    tNode TLLR = {NULL,  NULL    };
    tNode TRLL = {NULL,  NULL    };
    tNode TRLR = {NULL,  NULL    };
    tNode TRRR = {NULL,  NULL    };
    tNode TLL  = {&TLLL, &TLLR   }; // level 2
    tNode TRL  = {&TRLL, &TRLR   };
    tNode TRR  = {NULL,  &TRRR   };
    tNode TL   = {&TLL,  NULL    }; // level 1
    tNode TR   = {&TRL,  &TRR    };
    tNode T    = {&TL,   &TR     }; // level 0 (root)
    
    static int getCAL (tNode *node, int curr, int desired) {
        if (node == NULL) return 0;
        if (curr == desired) return 1;
        return getCAL (node->left,  curr+1, desired) +
               getCAL (node->right, curr+1, desired);
    }
    
    int main (void) {
        for (int i = 0; i < 5; i++) {
            int count = getCAL(&T, 0, i);
            printf ("Level %d has %d node%s\n", i, count, (count == 1) ? "" : "s");
        }
        return 0;
    }
    

    It builds a tree of the following form (where T means top, L is a left branch and R is a right branch):

                ______T______               (1 node)
               /             \
             TL               TR            (2 nodes)
            /                /  \
         TLL              TRL    TRR        (3 nodes)
        /   \            /   \      \
    TLLL     TLLR    TRLL     TRLR   TRRR   (5 nodes)
    
                                            (0 nodes)
    

    If you compile and run that code, you'll see it gives the correct node count at each level:

    Level 0 has 1 node
    Level 1 has 2 nodes
    Level 2 has 3 nodes
    Level 3 has 5 nodes
    Level 4 has 0 nodes
    
    0 讨论(0)
提交回复
热议问题