java 在二叉搜索树中,如何使用递归找到最重要的路径?

inb24sb2  于 2022-12-10  发布在  Java
关注(0)|答案(1)|浏览(140)

如果我有一个二叉搜索树,就像图中的那样,遍历方法会是什么样的,它可以递归地找到权重最大的路径?
我试着做了一个inOrder遍历,但是我认为我写的不正确。所以一个可以做这个的例子会很感激。
编辑:

private static void inOrder(BinaryNode tree) {
if(tree == null) return;

if (tree is an end node) {
 update the end node array
}

if(tree.rightchild != null) {
       parent[rightChild.getLabel()] = tree;
}
if(tree.leftChild != null) {
       parent[leftChild.getLabel()] = tree;
}

inOrder(tree.leftChild);
inOrder(tree.rightChild);
}

类,该类支持我正在尝试编写的类
第一次
sample input:示例输出:output for the tree image shown

h79rfbju

h79rfbju1#

您可以创建一个递归函数,比如 inorder 函数,但是您提供的inorder代码在很多方面都是错误的,因为它甚至没有使用BinaryNode类的现有属性。
这个递归函数应该返回最大权值 * 和对应的路径 *,它在以给定节点为根的树中找到。基本情况发生在给定节点为空时。在这种情况下,最大权值为0,路径为空。
有几种组织返回值的方法。我选择了ArrayList<Integer>,它的第一个条目是最大权重,所有其他条目都是0或1,表示向左或向右行走。
下面是该函数:

private static ArrayList<Integer> heaviestPath(BinaryNode root) {
        if (root == null) return new ArrayList<Integer>() {{ add(0); }};
        ArrayList<Integer> leftPath = heaviestPath(root.getLeftChild());
        ArrayList<Integer> rightPath = heaviestPath(root.getRightChild());
        if (leftPath.get(0) < rightPath.get(0)) {
            rightPath.set(0, rightPath.get(0) + root.getRightWeight());
            rightPath.add(1);
            return rightPath;
        } else {
            leftPath.set(0, leftPath.get(0) + root.getLeftWeight());
            leftPath.add(0);
            return leftPath;
        }
    }

下面是在引用root节点时调用它的方法:

BinaryNode root;
        // Construct the tree
        // ... your code ...
        //
     
        // Get the heaviest path starting from the root
        ArrayList<Integer> path = heaviestPath(root);
        // Extract the weight of the path and output it
        int weight = path.get(0);
        path.remove(0);
        System.out.println("Largest funness: " + weight);
        // Use the rest of the arraylist to walk along the path and print its node labels
        BinaryNode node = root;
        for (int side : path) {
            System.out.println("Node: " + node.getLabel());
            if (side == 1) {
                node = node.getRightChild();
            } else {
                node = node.getLeftChild();
            }
        }

相关问题