Algorithms(二)---二叉树的相关问题

声明本文中所用的二叉树的节点结构定义如下:

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;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章