簡體   English   中英

如何找到二叉樹的直徑?

[英]How do I find the diameter of a binary tree?

public class Diameter {
    
    // Klasse BinaryTree nicht modifizieren!
    public static class BinaryTree {
        int value;
        BinaryTree left;
        BinaryTree right;

        BinaryTree(int value) {
            this(value, null, null);
        }

        BinaryTree(int value, BinaryTree left, BinaryTree right) {
            this.value = value;
            this.left = left;
            this.right = right;
        }
    }

    public static int diameter(BinaryTree tree) {
        return 0;
    }

    public static void main(String[] args) {
        case1();
        case2();
        case3();
        case4();
        case5();
        case6();
        case7();
    }

    // Testfälle nicht modifizieren!
    public static void case1() {
        BinaryTree root = new BinaryTree(1,
                new BinaryTree(3,
                        new BinaryTree(7,
                                new BinaryTree(8,
                                        new BinaryTree(9),
                                        null),
                                null),
                        new BinaryTree(4,
                                null,
                                new BinaryTree(5,
                                        null,
                                        new BinaryTree(6)))),
                new BinaryTree(2)
        );
        System.out.println("Case 1: Solution should be 6 -- " + diameter(root));
    }
    
    public static void case2() {
        BinaryTree root = new BinaryTree(1);
        System.out.println("Case 2: Solution should be 0 -- " + diameter(root));
    }
    
    public static void case3() {
        BinaryTree root = new BinaryTree(1,
                new BinaryTree(2),
                null);
        System.out.println("Case 3: Solution should be 1 -- " + diameter(root));
    }
    
    public static void case4() {
        BinaryTree root = new BinaryTree(1,
                new BinaryTree(2),
                new BinaryTree(3));
        System.out.println("Case 4: Solution should be 2 -- " + diameter(root));
    }
    
    public static void case5() {
        BinaryTree root = new BinaryTree(1,
                new BinaryTree(2,
                        new BinaryTree(4),
                        null),
                new BinaryTree(3));
        System.out.println("Case 5: Solution should be 3 -- " + diameter(root));
    }

    public static void case6() {
        BinaryTree root = new BinaryTree(1,
                new BinaryTree(2,
                        new BinaryTree(3,
                                new BinaryTree(4,
                                        new BinaryTree(5,
                                                new BinaryTree(6,
                                                        null,
                                                        new BinaryTree(7)),
                                                null),
                                        null),
                                null),
                        null),
                null);
        System.out.println("Case 6: Solution should be 6 -- " + diameter(root));
    }

    public static void case7() {
        System.out.println("Case 7: Solution should be 0 -- " + diameter(null));
    }

}

我必須編程二叉樹的直徑是二叉樹中最長的路徑。 路徑的定義方式與圖形相同。 請注意,路徑不一定要通過根到 go。

在 Diameter class 中寫入一個直徑 function 以獲得二叉樹並返回樹的直徑。

每個節點由一個 integer 值、一個左子節點和一個右子節點組成。 每個孩子要么是一個節點,要么是 null

如何在我的程序中實現它? 我的想法是:

public int diameter (Node root)
{
    if (root == null) return 0;
    else return Math.max (
        diameter (root.left), 
        Math.max (
            diameter (root.right),
            height (root.left) + height (root.right) + 1));
}

public int height (Node root)
{
    if (root == null) return 0;
    else return 1 + Math.max (height (root.left), height (root.right));
}

我們可以進行深度優先遍歷並增加每個級別的高度。 並從左側或右側選擇最大值。 但我們也不斷跟蹤left+right並選擇最大的一個。

public static int max = 0;
public static int diameter(BinaryTree root, int height) {
    if (root == null) return height-1;

    int left = diameter(root.left, height + 1);
    int right = diameter(root.right, height + 1);
        
    int diameter = left+right-height*2; 
    max = max < diameter ? diameter : max;
        
    return Math.max(left,right);
}

這樣稱呼它:

max=0;
diameter(root,0);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM