【问题标题】:Level traversal in binary tree二叉树中的级别遍历
【发布时间】:2014-05-27 18:32:07
【问题描述】:

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

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方法?

【问题讨论】:

  • 你可以使用Guava的TreeTraverser,甚至BinaryTreeTraverser
  • 你有没有尝试过?请发布您尝试过的解决方案,并说明您的结果与预期结果有何不同。

标签: java recursion binary-tree tree-traversal


【解决方案1】:

您需要做的是删除循环,然后只关注一次通过现在循环中的内容。您需要将一些代码从私有方法中移出并移到您创建的公共方法中。就像检查 root == null、级别实例化等一样。然后您将继续调用私有方法,直到级别为空。以下是我更改签名的方法:

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() 两次,你的程序有一个错误,它永远不会清除你拥有的实例变量,因此它会从树中返回双倍的项目数。通过不使用实例变量,我消除了该错误。

【讨论】:

    猜你喜欢
    • 2017-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多