如何找到只剩下孩子的二叉树中的节点数?
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))
}
答案 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?
类型的参数。这意味着参数可以是Node
或nil
。
该函数确实返回无符号整数。
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和其他编译器支持)在满足某些条件时确实使用相同的堆栈帧。