在二叉树遍历期间跳过节点

时间:2011-10-30 06:11:15

标签: java language-agnostic binary-tree tree-traversal cluster-analysis

我需要遍历二叉树,跳过符合条件的任何节点的子节点。

这实现了树引导的聚类方法;当子树的叶子共同满足条件时,它们被认为是一个簇。

似乎启动的地方是预先遍序,但我不确定如何修改算法以跳过当前节点的所有子节点。

更新

除了以下两个(正确的)答案之外,还可以使用以下Java库:

  • MyArch TreeIter - 通用(带适配器类)树遍历,带子跳过和动态最大遍历深度
  • Phylosoft Forester - 使用getAllExternalDescendants和Newick-to-XML转换器实现树

2 个答案:

答案 0 :(得分:1)

第一部分很简单:

class Tree {
    Tree(int data) {
        this.data = data;
    }
    Tree left, right;
    Object object;
    int data;
}
public class Main {
    static void myPreorder(Tree tree) {
        if (tree == null) return;
        if (tree.data > 2) {
            System.out.println("skipping " + tree.data);
            return;
        }
        System.out.println("visiting " + tree.data);
        myPreorder(tree.left);
        myPreorder(tree.right);
    }
    public static void main(String[] args) {
        Tree root = new Tree(1);
        root.left = new Tree(2);
        root.right = new Tree(3);
        root.right.left = new Tree(4);
        root.right.right = new Tree(5);
        myPreorder(root);
    }
}

第二部分:“......当他们共同满足条件时,子树的叶子被认为是一个簇。......”很难。你需要检查一个节点的所有叶子,看它们是否符合跳过条件。

答案 1 :(得分:1)

如果通过跳过所有孩子,你不仅指直接后代而且是他们的整个子树,你可以做以下事情:

public void traverse(Node n){
    if (n==null)
        return;
    doSomethingWith(n);
    if (!conditionIsMet(n)){
        traverse(n.left);
        traverse(n.right);
    }
}