2016-04-19 5 views
0

Я пытаюсь выяснить, как закодировать рекурсивный алгоритм для подсчета количества листьев в двоичном дереве (не полное дерево). Я добираюсь до самого левого листа и не знаю, что вернуться оттуда. Я пытаюсь получить счет, загружая листья в список и получая размер этого списка. Вероятно, это плохой способ подсчета.Рекурсивно подсчитывать количество листьев в двоичном дереве без заданных параметров

public int countLeaves () { 

    List< Node<E> > leafList = new ArrayList< Node<E> >(); 
    //BinaryTree<Node<E>> treeList = new BinaryTree(root); 

    if(root.left != null) 
    { 
     root = root.left; 
     countLeaves(); 
    } 
    if(root.right != null) 
    { 
     root = root.right; 
     countLeaves(); 
    } 
    if(root.left == null && root.right == null) 
    { 
     leafList.add(root); 
    } 


     return(); 
} 
+0

Вы уверены, что хотите изменить свой корневой узел просто подсчитать ваши номера отпусков? – HuStmpHrrr

ответ

2

развивавших по идее @dasblinkenlight. Вы хотите, чтобы рекурсивно вызывать подсчеты на корневом узле &, передать номер # вызывающему. Что-то в следующих строках.

public int countLeaves() { 
return countLeaves(root); 
} 

/** 
* Recursively count all nodes 
*/ 
private static int countLeaves (Node<E> node) { 
if(node==null) 
    return 0; 

if(node.left ==null && node.right == null) 
    return 1; 
else { 
    return countLeaves(node.left) + countLeaves(node.right); 
    } 
} 

Edit: Похоже, подобная проблема была ранее попросила counting number of leaf nodes in binary tree

+1

разве вы не думаете, что это слишком многословно? должно быть только 2 'if's. – HuStmpHrrr

+0

@HuStmpHrrr, Спасибо, что указали это. Это было определенно очень много. Я отредактировал ваше предложение. – MSameer

+0

Фактически, поскольку вы разрешаете нулевой узел проходить, разветвление этой проблемы должно быть сведено только до нулевой проверки. также ваш другой случай неправильный. отсутствует '1'. – HuStmpHrrr

1

Проблема с реализацией в том, что она не восстанавливает значение переменной-члена root обратно в состояние, которое он имел перед входом в метод. Вы можете сделать это путем сохранения значения в локальной переменной, т.е.

Node<E> oldRoot = root; 
... // your method goes here 
root = oldRoot; 

Однако лучший подход заключается в Node<E> в качестве аргумента, а не полагаться на общей переменной:

public int countLeaves() { 
    return countLeaves(root); 
} 

private static int countLeaves (Node<E> node) { 
    ... // Do counting here 
} 
Смежные вопросы