Recursion 计算每个子树中的节点数

Recursion 计算每个子树中的节点数,recursion,tree,Recursion,Tree,我需要解决一个更大的算法,其中一个步骤是计算每个子树中的节点数 我不需要代码来做它,但我需要帮助来理解 这个练习是这样的: 基本上,我需要返回一个新的树,每个节点包含节点的值,以及左子树中的元素数和右子树中的元素数 这就是方法 每个子树上的公共AB编号(节点b a、节点b){ 我想我可以在第一行代码中创建子树,然后在遍历原始树时添加每个节点,当您返回递归时,计算节点数 但是我不知道怎么做。。 帮助 每个节点都有left node和right node以及numberNodesLeft和numb

我需要解决一个更大的算法,其中一个步骤是计算每个子树中的节点数 我不需要代码来做它,但我需要帮助来理解

这个练习是这样的:

基本上,我需要返回一个新的树,每个节点包含节点的值,以及左子树中的元素数和右子树中的元素数

这就是方法

每个子树上的公共AB编号(节点b a、节点b){

我想我可以在第一行代码中创建子树,然后在遍历原始树时添加每个节点,当您返回递归时,计算节点数

但是我不知道怎么做。。 帮助


每个节点都有left node和right node以及numberNodesLeft和numberNodesRight

我可以给你一个算法的伪代码:

class TreeNode
{
    integer CountLeftChildren()
    {
        integer count = 0
        if (hasLeftChildren)
        {
             foreach(child in LeftChildren)
             {
                  count++
                  child+=child.CountLeftChildren()
                  child+=child.CountRightChildren()
             }
        }
        return count
    }

    integer CountRightChildren()
    {
        integer count = 0
        if (hasRightChildren)
        {
             foreach(child in RightChildren)
             {
                  count++
                  child+=child.CountLeftChildren()
                  child+=child.CountRightChildren()
             }
        }
        return count
    }
}

希望对您有所帮助……

这里有一个Haskell的解决方案,因为它非常简洁,您应该能够理解算法的步骤,即使您不熟悉该语言

合适的树数据类型:

data Tree a = Nil
  | Leaf a
  | Br a (Tree a) (Tree a) deriving Show
图片中的示例树:

t = Br 3 (Br 5 Nil (Leaf 9))
          (Br 8 (Leaf 1) Nil)
递归函数,将具有整数节点的树转换为具有三个整数作为节点的树。递归解在tl和tr中表示左、右子树,计数函数对转换(子)树的节点进行计数

如果将上述代码保存在.hs文件中并在Haskell解释器中尝试,则可以使用它。在解释器中:

Main> t
Br 3 (Br 5 Nil (Leaf 9)) (Br 8 (Leaf 1) Nil)
Main> transform t
Br (2,3,2) (Br (0,5,1) Nil (Leaf (0,9,0))) (Br (1,8,0) (Leaf (0,1,0)) Nil)

我希望这有助于您使用所选语言开发正确的解决方案。

这是一个JAVA解决方案。基本上,创建一个包含左节点数和右节点数的TreeNode类。我意识到这个答案对于OP来说可能太晚了,但希望从长远来看对某人有所帮助

class TreeNode{
    TreeNode left;
    TreeNode right;
    int leftNodes;
    int rightNodes;
    int value;
    public TreeNode(int value){
        value=value;
        TreeNode left = null;
        TreeNode right = null;
        leftNodes =rightNodes=0;
    }
}

public void numofRightLeftSubTree(TreeNode root){
    numNodes(root);
    System.out.println("number of left tree nodes are " + root.leftNodes );
    System.out.println("number of right tree nodes are " + root.rightNodes);

}

public int numNodes(TreeNode root) {
    if (root == null) return 0;
    int left = numNodes(root.left);
    int right = numNodes(root.right);

    root.leftNodes = left;
    root.rightNodes = right;

    return left + right + 1;
}

一棵树中的节点数正好是左、右子树中的节点数加上根节点的节点数之和,这一事实应该很容易适用于一种简单的递归方法。如果需要,将该递归方法转换为迭代方法以避免巨树上的堆栈溢出留给读者作为练习必须处理这些树。。。
Main> t
Br 3 (Br 5 Nil (Leaf 9)) (Br 8 (Leaf 1) Nil)
Main> transform t
Br (2,3,2) (Br (0,5,1) Nil (Leaf (0,9,0))) (Br (1,8,0) (Leaf (0,1,0)) Nil)
class TreeNode{
    TreeNode left;
    TreeNode right;
    int leftNodes;
    int rightNodes;
    int value;
    public TreeNode(int value){
        value=value;
        TreeNode left = null;
        TreeNode right = null;
        leftNodes =rightNodes=0;
    }
}

public void numofRightLeftSubTree(TreeNode root){
    numNodes(root);
    System.out.println("number of left tree nodes are " + root.leftNodes );
    System.out.println("number of right tree nodes are " + root.rightNodes);

}

public int numNodes(TreeNode root) {
    if (root == null) return 0;
    int left = numNodes(root.left);
    int right = numNodes(root.right);

    root.leftNodes = left;
    root.rightNodes = right;

    return left + right + 1;
}