平衡二叉树、搜索二叉树及彻底二叉树

平衡二叉树:一棵空树或它的左右两个子树的高度差的绝对值不超过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; }
相关文章
相关标签/搜索