仅剩下子节点的二叉树中的节点数

时间:2015-12-27 15:17:24

标签: algorithm

如何找到只剩下孩子的二叉树中的节点数?

LeftNode(root)
{
    if(root==NULL) 
        return 0;

    if(root->left!=null && root-right==null)
        return (1+LeftNode(root->left));

    return (LeftNode (root->left) + LeftNode (root->right))
}

2 个答案:

答案 0 :(得分:1)

我会这样做(C ++):

int leftNode(Node * root)
{
  if (root == nullptr)
    return 0;

  // c is 1 if root has a left child and has not a right one
  int c = root->left != nullptr and root->right == nullptr ? 1 : 0;

  return c + leftNode(root->left) + leftNode(root->right);
}

答案 1 :(得分:0)

由于不需要特定语言,我将在Swift中编写我的解决方案

func nodesWithOnlyLeftChild(node:Node?) -> UInt {
    guard let node = node else { return 0 }
    let count: Uint = (node.left != nil && node.right == nil) ? 1 : 0
    return nodesWithOnlyLeftChild(node.left) + nodesWithOnlyLeftChild(node.right) + count
}

1:签名

func nodesWithOnlyLeftChild(node:Node?) -> UInt

该函数接受Node?类型的参数。这意味着参数可以是Nodenil。 该函数确实返回无符号整数。

2:检查参数

guard let node = node else { return 0 }

第一行验证输入参数不是nil。如果它不是nil则执行下一行,否则返回0

3:评估当前节点

let count: UInt = (node.left != nil && node.right == nil) ? 1 : 0

创建常量count。如果此节点只有一个左子节点,则填充1。否则0

4:递归通话

return nodesWithOnlyLeftChild(node.left) + nodesWithOnlyLeftChild(node.right) + count

该函数会返回应用于左侧孩子的nodesWithOnlyLeftChild的结果 + nodesWithOnlyLeftChild应用于正确的孩子 + 常量{{ 1}}

考虑

此功能的时间复杂度count,其中O(n)是三者中的节点。

空间复杂度n。 事实上,尽管我们可以进行最多n次递归调用,Tail Recursion(由LLVM和其他编译器支持)在满足某些条件时确实使用相同的堆栈帧。