Java BST-计数具有左和右子级的节点
正如标题中所述,我试图通过只计算BST中同时具有左和右子节点的节点来解决这个问题。我正在努力思考解决这个问题的逻辑 我想到了这样的事情 首先,检查根目录是否为null或是否有任何null子目录。接下来,向右遍历树并继续检查子项,在满足条件时增加一个计数器。但是,当我到达结束节点并需要返回到有一个左子节点要遍历的节点时,会发生什么呢?我有一个临时节点来跟踪最前面的父节点,但是当我需要升级到多个级别时呢?我假设这个问题的答案是递归地解决它,但我甚至不知道从哪里开始 以下是我所拥有的:Java BST-计数具有左和右子级的节点,java,recursion,binary-search-tree,Java,Recursion,Binary Search Tree,正如标题中所述,我试图通过只计算BST中同时具有左和右子节点的节点来解决这个问题。我正在努力思考解决这个问题的逻辑 我想到了这样的事情 首先,检查根目录是否为null或是否有任何null子目录。接下来,向右遍历树并继续检查子项,在满足条件时增加一个计数器。但是,当我到达结束节点并需要返回到有一个左子节点要遍历的节点时,会发生什么呢?我有一个临时节点来跟踪最前面的父节点,但是当我需要升级到多个级别时呢?我假设这个问题的答案是递归地解决它,但我甚至不知道从哪里开始 以下是我所拥有的: public
public int fullNodes() {
int count = 0;
Node n = root;
Node temp = null;
if (n == null || n.left == null && n.right == null) return count;
count++; //increment count, since the root has children on both sides
temp = n; //hold the previous place
n = n.right; //go right
//Now what?
return count;
}
当我解决问题时,我仍然在努力递归思考,除了我的问题,你是如何学会递归思考的?只是大量的练习,还是有一些技巧和技巧可以用来解决问题 在子节点上调用相同的函数,而不是使用temp变量来保存前一个节点(仅适用于深度为1的节点) 递归树遍历可能如下所示:
public int countSomething (Node node) {
// Self;
//
int result = 1; // use your required logic here
// Children;
//
if (node.left != null)
result += countSomething( node.left);
if (node.right != null)
result += countSomething( node.right);
// done.
return result;
}
// example usages
int treeTotal = countSomething( rootNode);
int subtreeTotal = countSomething( subtree);
然后,执行调用堆栈将保存函数的递归调用,每个调用都有相应的上下文。当顶级调用返回时,它将对调用它的整个树/或子树的答案进行求和
为您的BST“node有两个左和右子节点”放入适当的逻辑,而不是常量1。首先让我们创建节点类的表示形式
class Node {
public Node left;
public Node right;
public Node(){}
public Node(Node left, Node right) {
this.left = left;
this.right = right;
}
}
然后我们编写递归函数和使用您的函数的客户端
public class Main {
public static int countNodes(Node root) {
if(root!=null && root.left!=null && root.right!=null) {
return 1+countNodes(root.left)+countNodes(root.right);
}
return 0;
}
public static void main(String[] args) {
Node right = new Node();
Node left = new Node();
Node root = new Node(left, right);
root.right = new Node(new Node(), new Node());
System.out.println(countNodes(root));
}
}
假设你有一个二叉树,你想回答这个问题,“有多少节点同时有左和右子节点?”假设你已经知道左子树的答案(如果有),并且你已经知道右子树的答案(如果有)。如果您知道这两个答案,那么如何计算整个树的答案?专注于此,不要担心你将如何穿越这棵树。这就是递归思考的方式。nodesWithLeftAndRight(node):如果node为null,则结果为零。否则,结果是nodeWithLeftAndRight(左节点)+nodeWithLeftAndRight(右节点)+(如果左节点和右节点都不为null,则为1,否则为0)这是否考虑到节点必须同时具有左和右子节点才能增加计数?如果是,在哪里?我对这里发生的事情有点困惑。@23k这个方法演示了递归,但我不想为您做所有的工作。正如它所说的,无论是在代码中还是在答案中,您都应该将所需的每个节点规则放入其中。当然不是,我只是对您的代码正在做什么以及注释感到困惑。也许这是显而易见的,但我似乎忽略了这一点。每一个节点“自身”数1表示树或子树中的节点总数。如果只想计算满足某个条件的节点,则如果满足该条件,则应计算1,否则为0;在添加左侧和右侧子分类汇总之前。