【问题标题】:How can I get all leaf nodes of a tree?如何获取树的所有叶节点?
【发布时间】:2015-10-01 19:22:47
【问题描述】:

假设我在一棵树中有一个节点,如何获取祖先是这个节点的所有叶子节点?

我已经这样定义了 TreeNode:

public class TreeNode<T>
{
    /** all children of the node */
    private List<TreeNode<T>> children = new ArrayList<TreeNode<T>>();
    /** the parent of the node, if the node is root, parent = null */
    private TreeNode<T> parent = null;
    /** the stored data of the node */
    private T data = null;

    /** the method I want to implement */
    public Set<TreeNode<T>> getAllLeafNodes()
    {
        Set<TreeNode<T>> leafNodes = new HashSet<TreeNode<T>>();
        return leafNodes;
    }
}

【问题讨论】:

  • 继续遍历childrens,所有那些children list为空的children都离开了吗?有什么问题?
  • 叶节点应该有一个空的子节点列表;所以你可以在你的节点上实现一个方法 isLeaf() 。然后你将不得不递归地检查你节点的所有子节点。

标签: java


【解决方案1】:

使用递归。

  • 如果节点本身是叶子,则返回它
  • 否则,返回其子节点的所有叶节点

类似这样的东西(未测试):

public Set<TreeNode<T>> getAllLeafNodes() {
    Set<TreeNode<T>> leafNodes = new HashSet<TreeNode<T>>();
    if (this.children.isEmpty()) {
        leafNodes.add(this);
    } else {
        for (TreeNode<T> child : this.children) {
            leafNodes.addAll(child.getAllLeafNodes());
        }
    }
    return leafNodes;
}

【讨论】:

  • 我想在互联网上检查我的获取所有叶子的方法是否正常,并且我发现这个 anwser 看起来和我的一模一样,除了我使用的是 List 而不是 Set。我认为这没关系:D
【解决方案2】:

创建堆栈并推送根节点。

Stack<Node> st = new Stack<>();
st.push(root);      
CL(st.peek());

调用递归方法。

public void CL(Node root){
        if (st.peek().left == null && st.peek().right == null ) {//if leaf node
            System.out.println(st.peek().data);//print
            st.pop();
            return;
        }
        else{
            if(st.peek().left != null){
                st.add(st.peek().left);
                CL(st.peek());
            }
            if(st.peek().right != null){
                st.add(st.peek().right);
                CL(st.peek());
            }
        }
        st.pop();
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-15
    • 1970-01-01
    • 2012-05-04
    • 1970-01-01
    • 1970-01-01
    • 2021-11-28
    相关资源
    最近更新 更多