平衡二叉樹:一棵空樹或它的左右兩個子樹的高度差的絕對值不超過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; }