【樹形DP】 二叉樹節點間的最大距離問題
阿新 • • 發佈:2021-02-11
二叉樹節點間的最大距離問題
【問題】
從二叉樹的節點a出發, 可以向上或者向下走, 但沿途的節點只能經過一次, 到達節點b時路徑上的節點個數叫作a到b的距離, 那麼二叉樹任何兩個節點之間都有距離, 求整棵樹上的最大距離。
【解題思路】
1.以root為頭結點,來分析這棵樹,有兩種情況:
(1)這個最大值經過了頭結點,這個時候最大距離為左樹中離頭結點最遠的結點到右樹中離頭結點最遠的結點的距離。
(2)這個最大值不經過頭結點root,那麼最大距離就是左樹和右樹的最大距離較大的那一個。
2.構造一個類表示遞迴過程中左子樹和右子樹返回的資料maxDistance最大距離,和h最大高度
3.遞迴,將左子樹的最大距離與右子樹的最大距離以及(左子樹高度+右子樹高度+1)這三個值比較,返回最大值以及左子樹與右子樹中h的最大值+1。
【程式碼實現】
public class TreeMaxDistance {
/*二叉樹節點間的最大距離問題
從二叉樹的節點a出發, 可以向上或者向下走, 但沿途的節點只能經過一次, 到達節點b時路
徑上的節點個數叫作a到b的距離, 那麼二叉樹任何兩個節點之間都有距離, 求整棵樹上的最
大距離。*/
public static ReturnData treeMaxDistance(Node root) {
if ( root == null) {
return new ReturnData(0, 0);
}
ReturnData leftData = treeMaxDistance(root.left);
ReturnData rightData = treeMaxDistance(root.right);
int max = leftData.h + rightData.h + 1;
int max1 = leftData.maxDistance;
int max2 = rightData. maxDistance;
max = Math.max(Math.max(max1, max2), max);
int h = Math.max(leftData.h, rightData.h);
return new ReturnData(max, h + 1); //h+1是因為這個時候加上了這個樹的頭結點
}
public static class ReturnData {
int maxDistance; //表示最大距離
int h; //表示樹的高度
public ReturnData(int maxDistance, int h) {
this.maxDistance = maxDistance;
this.h = h;
}
}
//結點類
public static class Node {
int value;
Node left;
Node right;
public Node(int value) {
this.value = value;
}
}
//測試程式碼
public static void main(String[] args) {
Node root = new Node(1);
Node node2 = new Node(2);
Node node3 = new Node(3);
Node node4 = new Node(4);
Node node5 = new Node(5);
Node node8 = new Node(8);
Node node9 = new Node(9);
Node node10 = new Node(10);
Node node11 = new Node(11);
root.left = node2;
root.right = node3;
node2.left = node4;
node2.right = node5;
node4.left = node8;
node8.left = node11;
node5.right = node9;
node9.right = node10;
ReturnData returnData = treeMaxDistance(root);
System.out.println("maxDistance=" + returnData.maxDistance);
}
}