概念
节点的度: 表示当前节点含有的字树的个数。
树的度: 当前树中最大节点的度就是树的度。
叶子节点: 度为0的节点,也就是没有子树的节点。
在二叉树中,树的度为2,且一个节点最多存在两颗子树,子树有左右顺序之分。
两种特殊的二叉树
1、 满二叉树: 一棵二叉树,如果每层的结点数都达到最大值,则这棵二叉树就是满二叉树。若满二叉树的层高为k,则满二叉树的节点个数为2^k - 1。第k层的节点个数为2^(k-1)。
2、完全二叉树: 完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从0至n-1的结点一一对应时称之为完全二叉树。 要注意的是满二叉树是一种特殊的完全二叉树。
二叉树的性质
1、对任何一棵二叉树, 如果其叶结点个数为 n0, 度为2的非叶结点个数为 n2,则有n0=n2+1。
2、具有n个结点的完全二叉树的深度k为log_2(n + 1) 向上取整。
3、在完全二叉树中,度为1的节点要么是0个,要么是1个,故当完全二叉树的总节点个数 (n0 + n1 + n2 = 2n2 + n1 + 1) 为奇数时,不可能存在度为1的节点。
二叉树的存储
二叉树的存储结构分为:顺序存储和类似于链表的链式存储。
二叉树的链式存储是通过一个一个的节点引用起来的,常见的表示方式有二叉和三叉表示方式。
// 孩子表示法
class Node {
int val; // 数据域
Node left; // 左孩子的引用,常常代表左孩子为根的整棵左子树
Node right; // 右孩子的引用,常常代表右孩子为根的整棵右子树
}
// 孩子双亲表示法
class Node {
int val; // 数据域
Node left; // 左孩子的引用,常常代表左孩子为根的整棵左子树
Node right; // 右孩子的引用,常常代表右孩子为根的整棵右子树
Node parent; // 当前节点的根节点
}
二叉树的节点个数
// 传入一颗以root为根的二叉树,就能求出该树的结点个数
public int treeNodeSize(TreeNode root) {
// // 1.base case
// if (root == null) {
// return 0;
// }
// // 整棵树的结点个数 = 自己1 + 左子树的所有节点 + 右子树的所有节点
// return 1 + treeNodeSize(root.left) + treeNodeSize(root.right);
return root == null ? 0 : 1 + treeNodeSize(root.left) + treeNodeSize(root.right);
}
二叉树的第k层的节点个数
// 传入一颗以root为根的二叉树,就能求出第k层的结点个数
public int getKLevelNodes(TreeNode root,int k) {
// 1.base case
if (root == null || k <= 0) {
return 0;
}
if (k == 1) {
return 1;
}
// 第k层的结点个数 = 左子树的第k-1层结点个数 +右子树的第k - 1层结点个数
return getKLevelNodes(root.left,k - 1)
+ getKLevelNodes(root.right,k - 1);
}
二叉树叶子节点的个数
//传入一颗以root为根的二叉树,就能统计出当前这棵树的叶子结点的个数
public int leafNodes(TreeNode root) {
// 1.base case
if (root == null) {
return 0;
}
if (root.left == null && root.right == null) {
return 1;
}
// 总的叶子结点个数 = 左子树的叶子节点个数 + 右子树的叶子结点个数
return leafNodes(root.left) + leafNodes(root.right);
}
二叉树的高度
public int height(TreeNode root) {
// 1.base case
// if (root == null) {
// return 0;
// }
// // 总高度 = 1 + Math.max(左子树高度,右子树高度)
// return 1 + Math.max(height(root.left),height(root.right));
return root == null ? 0 : 1 + Math.max(height(root.left),height(root.right));
}
判断二叉树中值为val的节点是否存在
// 在当前以root为根的二叉树中,判断值为val的元素是否存在
public boolean contains(TreeNode root,char val) {
// 1.base case
if (root == null) {
return false;
}
if (root.val == val) {
return true;
}
return contains(root.left,val) || contains(root.right,val);
}
继续加油!!!