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