二叉树中的叶子数量

时间:2013-10-24 14:31:15

标签: algorithm binary-search-tree binary-search

我是二叉树的初学者,并且一直在努力完成算法手册。我已经了解了BST的各种遍历方法(预订,后期订单等)。

有人可以解释一下如何通过BST来计算离开的节点数(没有孩子)吗?

非常感谢!

3 个答案:

答案 0 :(得分:6)

使用递归方法:

  • 换叶1。
  • 对于非叶子,返回应用于其子元素的方法的总和。

PHP中的示例:

class BST {
  public $left;  // The substree containing the smaller entries
  public $right; // The substree containing the larger entries
  public $data;  // The value that is stored in the node
}

function countLeafs(BST $b) {
  // Test whether children exist ...
  if ($b->left || $b->right) {
    // ... yes, the left or the right child exists. It's not a leaf.
    // Return the sum of calling countLeafs() on all children.
    return ($b->left  ? countLeafs($b->left)  : 0)
         + ($b->right ? countLeafs($b->right) : 0);
  } else {
    // ... no, it's a leaf
    return 1;
  }
}

答案 1 :(得分:4)

不同的遍历方法会导致不同的算法(尽管对于像这样的简单问题,所有DFS变体都或多或少相同)。

我假设您有一个由Node类型的对象组成的BST。节点有两个类型为left的{​​{1}}和right字段,它们是节点的子节点。如果孩子不在场,则该字段的值为Node。整个树由对根的引用引用,称为null。在java中:

root

通过递归最容易实现DFS:定义方法

class Node {
    public Node left;
    public Node right;
}

Node root;

返回以int numberOfLeafs(Node node) 为根的子树中的叶子数。当然,node应该产生整棵树的叶子数。

如上所述,区分前,中,后顺序遍历实际上是人为的,但无论如何我都会这样做:

预订DFS :首先处理当前节点,然后处理子节点

numberOfLeafs(root)

有序DFS :首先处理左子,然后处理当前节点,然后处理右子

int numberOfLeafs(Node node) {
    int result = 0;
    if (node.left == null && node.right == null)
        result += 1;
    if (node.left != null)
        result += numberOfLeafs(node.left)
    if (node.right != null)
        result += numberOfLeafs(node.right)
    return result;
}

订购后DFS :首先处理子项,然后使用当前节点

int numberOfLeafs(Node node) {
    int result = 0;
    if (node.left != null)
        result += numberOfLeafs(node.left)
    if (node.left == null && node.right == null)
        result += 1;
    if (node.right != null)
        result += numberOfLeafs(node.right)
    return result;
}

对于 BFS ,通常使用带有队列的简单循环,在该队列中添加未访问的顶点。我现在假设我有一个类int numberOfLeafs(Node node) { int result = 0; if (node.left != null) result += numberOfLeafs(node.left) if (node.right != null) result += numberOfLeafs(node.right) if (node.left == null && node.right == null) result += 1; return result; } ,我可以Queue结尾的节点和前面的add个节点:

take

答案 2 :(得分:0)

试试这个

int countLeafNodes(BTNode node) { 
if (node == null)
        return 0;
    if (node.getLeftChild() == null && node.getRightChild() == null
            && node.getParent() != null)//this is a leaf, no left or right child
        return 1;
    else
        return countLeafNodes(node.getLeftChild())
                + countLeafNodes(node.getRightChild());
}

以递归方式计算左子树和右子树的叶节点并返回总计数