平衡二叉樹、搜索二叉樹及完全二叉樹


平衡二叉樹:一棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,並且左右兩個子樹都是一棵平衡二叉樹。

判斷標准:如果以每一個點作為頭結點的樹都是平衡樹,則整棵樹是平衡樹

(1)左樹是否平衡

(2)右樹是否平衡

(3)再都是平衡情況下,左樹高度?

(4)再都是平衡情況下,右樹高度?

進階:樹形DP

搜索二叉樹:是一棵空樹,或者是具有下列性質的二叉樹: 若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值; 若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值; 它的左、右子樹也分別為二叉排序樹。

 1、如何判斷一棵樹是否為搜索二叉樹:

 2、如何判斷一棵樹是否為完全二叉樹:(1)二叉樹按層遍歷,一個節點有右孩子沒左孩子,一定不是完全二叉樹。

                 (2)如果一個節點它不是左右兩個孩子都全,它后面遇到的節點都必須是葉節點

3、已知一棵完全二叉樹,求其節點個數:先遍歷左邊界,就可以求出樹的高度(2^l-1),然后遍歷右子樹的左邊界,看右子樹的左邊界有沒有到最后一層,如果有到,說明頭結點的左子樹是滿二叉樹,然后可以對右子樹進行遞歸,因為這又是一棵完全二叉樹。如果沒到說明頭結點的右子樹是滿二叉樹,只是會少一層,而左子樹是完全二叉樹,可以對左子樹遞歸。

public static class Node {
        public int value;
        public Node left;
        public Node right;

        public Node(int data) {
            this.value = data;
        }
    }

    public static int nodeNum(Node head) {
        if (head == null) {
            return 0;
        }
        return bs(head, 1, mostLeftLevel(head, 1));
    }

    public static int bs(Node node, int l, int h) {
        if (l == h) {
            return 1;
        }
        if (mostLeftLevel(node.right, l + 1) == h) {
            return (1 << (h - l)) + bs(node.right, l + 1, h);   //位運算,等價於2^(h-l)
        } else {
            return (1 << (h - l - 1)) + bs(node.left, l + 1, h);
        }
    }

    public static int mostLeftLevel(Node node, int level) {
        while (node != null) {
            level++;
            node = node.left;
        }
        return level - 1;
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM