二叉树中的级别遍历

时间:2014-04-13 22:29:04

标签: java recursion binary-tree tree-traversal

以下是我正在编写的二叉树类的代码部分。

class Node<T> {
    private T value;
    private Node<T> left;
    private Node<T> right;

    public T getValue() {
        return value;
    }

    public void setValue(T value) {
        this.value = value;
    }

    public Node<T> getLeft() {
        return left;
    }

    public void setLeft(Node<T> left) {
        this.left = left;
    }

    public Node<T> getRight() {
        return right;
    }

    public void setRight(Node<T> right) {
        this.right = right;
    }

    public Node() {}

    public Node(T value) {
        this.value = value;
    }

    public Node(T value, Node<T> left, Node<T> right) {
        this.value = value;
        this.left = left;
        this.right = right;
    }
}

import java.util.*;

public class Tree<T extends Comparable<T>> {
    private Node<T> root;
    private List<T> levelOrderList = new ArrayList<T>();

    public Node<T> getRoot() {
        return root;
    }

    public Tree() {
    }

    public Tree(Node<T> root) {
        this.root = root;
    }

    private List<T> getLevelOrderList(Node<T> root){
        if (root == null)
            return Collections.emptyList();

        Queue<Node<T>> level  = new LinkedList<Node<T>>();
        level.add(root);
        while(!level.isEmpty()){
            Node<T> node = level.poll();
            levelOrderList.add(node.getValue());
            if(node.getLeft() != null)
                level.add(node.getLeft());
            if(node.getRight() != null)
                level.add(node.getRight());
        }
        return levelOrderList;
    }

    public List<T> getLevelOrderList() {
        return getLevelOrderList(root);
    }
}

方法getLevelOrderList()按级别顺序返回树中元素的列表。 问题是:如何使用递归重写方法getLevelOrderList?

1 个答案:

答案 0 :(得分:0)

你需要做的是删除循环,然后只关注一遍现在循环中的内容。您需要将某些代码移出私有方法并转移到您创建的公共方法中。就像检查root == null,level instantiation等一样。然后你只是继续调用private方法,直到level为空。以下是我更改签名的方式:

public List<T> getLevelOrderList() {
    if( root == null ) return Collections.emptyCollection();

    List<Node<T>> level = new ArrayList<Node<T>>();
    List<T> values = new ArrayList<T>();
    level.add( root );

    return getLevelOrderList( level, values );
}

private List<T> getLevelOrderList(List<Node<T>> level, List<T> values) {
    if( level.isEmpty() ) return values;

    // do the next step to visit the node at the head of the list and recurse
}

这应该足以让你开始,但我不能放弃它,因为它显然是功课。哦,你的程序有一个错误,如果你两次调用getLevelOrderList(),它永远不会清除你有的实例变量,所以它将从树中返回两倍的项目。通过不使用实例变量,我删除了该错误。