聲明本文中所用的二叉樹的節點結構定義如下:
class Node {
private Node left;
private Node right;
private int data;
public Node(Node left, Node right, int data) {
this.left = left;
this.right = right;
this.data = data;
}
public Node getLeft() {
return left;
}
public void setLeft(Node left) {
this.left = left;
}
public Node getRight() {
return right;
}
public void setRight(Node right) {
this.right = right;
}
public int getData() {
return data;
}
public void setData(int data) {
this.data = data;
}
}
其中:空二叉樹的高度定義爲-1, 只有根節點的二叉樹定義爲0。
1.求二叉樹中相距最遠的兩個節點之間的距離。
求兩個節點的最遠距離,假設相距最遠的兩個節點分別爲A、B,它們的最近共同父節點(允許一個節點是其自身的父節點)爲C,則A到B的距離 = A到C的距離 + B到C的距離。
A到C的距離 = C的左子樹的高度。同理,B到C的距離 = C的右子樹的高度。因此,本問題可以轉化爲:“二叉樹每個節點的左右子樹高度和的最大值”。
int maxDistance = 0;
public int getMaxDistance(Node root) {
int leftHeight = (null != root.getLeft()) ? getMaxDistance(root.getLeft())+1:0;
int rightHeight = (null != root.getRight()) ? getMaxDistance(root.getRight())+1:0;
if(maxDistance < (leftHeight + rightHeight)) maxDistance = leftHeight + rightHeight;
return leftHeight>rightHeight?leftHeight:rightHeight;
}
2.判斷二叉樹是否平衡二叉樹
平衡二叉樹的定義:每個結點的左右子樹的高度差小等於1,只須在計算二叉樹高度時,同時判斷左右子樹的高度差即可。
boolean balanced = true;
public int isBalanceTree(Node root) {
if(false == balanced) return 0;
int leftHeight = (null != root.getLeft()) ? getMaxInstance(root.getLeft())+1:0;
int rightHeight = (null != root.getRight()) ? getMaxInstance(root.getRight())+1:0;
int diff = leftHeight - rightHeight;
if(diff > 1 || diff < -1) balanced = false;
return leftHeight>rightHeight?leftHeight:rightHeight;
}