计算每个子树中的节点

时间:2013-11-27 14:29:28

标签: recursion tree

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

练习是这样的:

enter image description here

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

这是方法

public AB NumberOnEachSubtree(NodeAB a,NodeAB b){

}

我想我可以在第一行代码中创建子树,然后当我返回递归计数节点数时,通过orignal树添加每个节点

但我不知道该怎么做.. 帮助

每个节点都有左节点和右节点以及numberNodesLeft和numberNodesRight

3 个答案:

答案 0 :(得分:1)

这是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;
}

答案 1 :(得分:0)

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

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
    }
}

希望它有所帮助...

答案 2 :(得分:0)

这是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)

递归函数,将具有Integer节点的树转换为具有Trgers三元组作为节点的树。递归解决方案在左和右子树的tl和tr中,count函数计算转换(子)树的节点。

transform :: Tree Integer -> Tree (Integer, Integer, Integer)
transform Nil = Nil
transform (Leaf a) = Leaf (0, a, 0)
transform (Br a l r) = (Br (count tl, a, count tr) tl tr)
  where tl = transform l 
        tr = transform r 

        count Nil      = 0
        count (Leaf a) = 1
        count (Br a l r) = count l + count r + 1

如果将上述代码保存在.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)

我希望这可以帮助您以您选择的语言开发正确的解决方案。