节点的高度:节点到叶子节点的最长路径(变数);从下至上;叶子节点为零
节点的深度:根节点到这个节点所经历的边的个数;从上之下;根节点为零
节点的层数:节点的深度+1;
树的高度:根节点的高度
满二叉树:叶子节点全都在最底层;除了叶子节点之外,每个节点都有左右两个子节点
完全二叉树:叶子节点都在最底下两层,最后一层的叶子节点都靠左排列;并且除了最后一层,其他层的节点个数都要达到最大
二叉树存储:一种是基于指针或者引用的二叉链式存储法,一种是基于数组的顺序存储法
链式存储法:每个节点有三个字段,其中一个存储数据,另外两个是指向左右子节点的指针,我们只要知道根节点就可以通过左右子节点的指针将整颗树串起来
数组的顺序存储法:把根节点存储在下标i = 1的位置,那左子节点存储在下标2*i = 2 的位置,右子节点存储在2*i +1 = 3的为位置
完全二叉树仅仅浪费一个下标为0的存储位置,如果是非完全二叉树会浪费比较多的数组存储空间
二叉树的遍历:前序遍历,中序遍历和后序遍历
前序遍历是指,对于树中的任意节点来说,先打印这个节点,然后打印他的左子树,最后打印他的右子树
中序遍历是指,对于树中的任意节点来说,先打印他的左子树,然后打印他的本身,最有打印他的右子树
后序遍历是指,对于树的任意节点来说,先打印他的左子树,然后打印右子树,最后打印这个节点本身
总的来说先打印左子树然后再打印右子树,而前中后遍历就是节点在左子树前面,左子树和右子树中间,右子树后面的打印方式
二叉树的前中后序遍历是一个递归过程
前序遍历的递推公式:
preOrder(r) = print r->preOrder(r->left)->preOrder(r->right)
中序遍历的递推公式:
inOrder(r) = inOrder(r->left)->print r->inOrder(r->right)
后序遍历的递推公式:
postOrder(r) = postOrder(r->left)->postOrder(r->right)->print r
代码实现
void preOrder(Node* root) {
if (root == null) return;
print root // 此处为伪代码,表示打印root节点
preOrder(root->left);
preOrder(root->right);
}
void inOrder(Node* root) {
if (root == null) return;
inOrder(root->left);
print root // 此处为伪代码,表示打印root节点
inOrder(root->right);
}
void postOrder(Node* root) {
if (root == null) return;
postOrder(root->left);
postOrder(root->right);
print root // 此处为伪代码,表示打印root节点
}