平衡二叉樹、搜索二叉樹及徹底二叉樹

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

判斷標準:若是以每個點做爲頭結點的樹都是平衡樹,則整棵樹是平衡樹this

(1)左樹是否平衡spa

(2)右樹是否平衡code

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

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

進階:樹形DP遞歸

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

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

 二、如何判斷一棵樹是否爲徹底二叉樹:(1)二叉樹按層遍歷,一個節點有右孩子沒左孩子,必定不是徹底二叉樹。進階

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

三、已知一棵徹底二叉樹,求其節點個數:先遍歷左邊界,就能夠求出樹的高度(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; }
相關文章
相關標籤/搜索