我是二叉树的初学者,并且一直在努力完成算法手册。我已经了解了BST的各种遍历方法(预订,后期订单等)。
有人可以解释一下如何通过BST来计算离开的节点数(没有孩子)吗?
非常感谢!
答案 0 :(得分:6)
使用递归方法:
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());
}
以递归方式计算左子树和右子树的叶节点并返回总计数