[英]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.