Java 理解二叉搜索树计数
我很难理解这个二叉搜索树方法是如何计算节点的,我在网上看过很多例子,但是我找不到一个能准确解释发生了什么的例子 以下是一个例子:Java 理解二叉搜索树计数,java,recursion,binary-search-tree,dynamic-programming,Java,Recursion,Binary Search Tree,Dynamic Programming,我很难理解这个二叉搜索树方法是如何计算节点的,我在网上看过很多例子,但是我找不到一个能准确解释发生了什么的例子 以下是一个例子: public int nodes() { int leftNodes = 0; if (left != null) { leftNodes = left.nodes(); } int rightNodes = 0; if (right != null) { rightNodes = right
public int nodes() {
int leftNodes = 0;
if (left != null) {
leftNodes = left.nodes();
}
int rightNodes = 0;
if (right != null) {
rightNodes = right.nodes();
}
return leftNodes + rightNodes + 1;
}
这就是我如何理解这个方法的过程,也许有人能帮我理解我哪里出了问题
int CountNodes(node*root)
{
if(root==NULL)
return 0;
if(root->left!=NULL)
{
n=n+1;
n=CountNodes(root->left);
}
if(root->right!=NULL)
{
n=n+1;
n=CountNodes(root->right);
}
return n;
}
我发现这种方法更容易遵循,因为每次发现节点时,n都明显地递增
我的问题是如何在递归调用中增加leftNodes/rightNodes值 您应该考虑递归的结束 假设您有一个没有子节点的节点
left
和right
都将是null
,因此您不会进行递归调用
你会回来的
leftNodes + rightNodes + 1; // 0 + 0 + 1 == 1
leftNodes + rightNodes + 1; // 1 + 1 + 1 == 3
现在,假设您有一个简单的树,它由根、左子级和右子级组成
当您为该树的根调用nodes()
时,left
和right
都不为空,因此我们将同时调用left.nodes()
和right.nodes()。由于左侧和右侧子节点都是叶节点(即它们没有子节点),因此对它们的递归调用都将返回1,如上所述
因此,当递归调用返回时,我们将返回
leftNodes + rightNodes + 1; // 0 + 0 + 1 == 1
leftNodes + rightNodes + 1; // 1 + 1 + 1 == 3
这是树中的节点数。这是顺序遍历的基本实现。对于每个节点,它将转到左子节点,直到没有剩余的左子节点为止(由于递归,就像在每次访问节点时将其推送到堆栈中一样)。然后对堆栈顶部重复相同的过程,直到堆栈中没有剩余的元素(再次注意,堆栈用于使事情比递归更简单)。执行此操作时,它基本上会将访问的每个节点的总和增加1。变量leftNodes
和righnodes
是方法nodes()
的局部变量,这意味着每个方法调用都有不同的变量实例
因此,当您递归调用该方法(例如使用left.nodes()
)时,leftNodes
的值在递归调用前后是相同的,因为它(调用)将有一个leftNodes
(和rightNodes
)的实例。+1
部分是两个left的基本情况,正确和当前。它对子树中的每个节点调用一次,从而给出子树中的节点总数。如果left或right为null,则只为left或right返回0。