Java BST-计数具有左和右子级的节点

Java BST-计数具有左和右子级的节点,java,recursion,binary-search-tree,Java,Recursion,Binary Search Tree,正如标题中所述,我试图通过只计算BST中同时具有左和右子节点的节点来解决这个问题。我正在努力思考解决这个问题的逻辑 我想到了这样的事情 首先,检查根目录是否为null或是否有任何null子目录。接下来,向右遍历树并继续检查子项,在满足条件时增加一个计数器。但是,当我到达结束节点并需要返回到有一个左子节点要遍历的节点时,会发生什么呢?我有一个临时节点来跟踪最前面的父节点,但是当我需要升级到多个级别时呢?我假设这个问题的答案是递归地解决它,但我甚至不知道从哪里开始 以下是我所拥有的: public

正如标题中所述,我试图通过只计算BST中同时具有左和右子节点的节点来解决这个问题。我正在努力思考解决这个问题的逻辑

我想到了这样的事情

首先,检查根目录是否为null或是否有任何null子目录。接下来,向右遍历树并继续检查子项,在满足条件时增加一个计数器。但是,当我到达结束节点并需要返回到有一个左子节点要遍历的节点时,会发生什么呢?我有一个临时节点来跟踪最前面的父节点,但是当我需要升级到多个级别时呢?我假设这个问题的答案是递归地解决它,但我甚至不知道从哪里开始

以下是我所拥有的:

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;在添加左侧和右侧子分类汇总之前。