Algorithm 二叉树中只有剩余子节点的节点数

Algorithm 二叉树中只有剩余子节点的节点数,algorithm,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)) } 我会这样

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

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))
}
我会这样做(C++):


由于不需要特定的语言,我将用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
let count: UInt = (node.left != nil && node.right == nil) ? 1 : 0
该函数接受类型为
Node?
的参数。这意味着参数可以是
节点
nil
。 该函数不返回无符号整数

2:检查参数

guard let node = node else { return 0 }
第一行验证输入参数不是
nil
。如果不是nil,则执行下一行,否则返回
0

3:评估当前节点

func nodesWithOnlyLeftChild(node:Node?) -> UInt
let count: UInt = (node.left != nil && node.right == nil) ? 1 : 0
将创建常量
计数
。如果此节点只有一个左子节点,则填充
1
<代码>0否则

4:递归调用

return nodesWithOnlyLeftChild(node.left) + nodesWithOnlyLeftChild(node.right) + count
该函数确实返回应用于左子项的
nodesWithOnlyLeftChild
的结果+
nodeswithonlyftchild
应用于右子项的常量+

考虑 此函数的时间复杂度
O(n)
,其中
n
为三个节点中的节点

空间复杂度是
O(1)

事实上,尽管我们可以有最多n个递归调用,但在满足某些条件时(LLVM和其他编译器支持)确实使用相同的堆栈框架。

您的算法看起来清晰且正常。那么问题是什么呢?@YoungHobbit-右边的孩子可能有左边的child@cricket_007我得到了它。起初我误解了。谢谢。您的问题已被编辑,现在您的解决方案似乎正确。在编辑之前,我给了你一个与你的答案基本相同的答案,什么时候是“和”一个关键词?@gen-y-s我真的不知道从什么时候开始,或者它是否是官方的。我可以肯定的是,它可以与gcc和clang编译器一起工作。。。我个人更喜欢这种方式,因为它比单纯的操作符更有表现力&&