声明本文中所用的二叉树的节点结构定义如下:
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;
}