二叉树

本文介绍了二叉树的相关概念,包括节点的高度、深度和层数,以及树的高度。讨论了满二叉树和完全二叉树的区别,并提到了二叉树的两种存储方法:链式存储法和基于数组的顺序存储法。此外,文章还详细解释了二叉树的前序、中序和后序遍历及其递归公式,并指出这些遍历方法在实际编程中的应用。

节点的高度:节点到叶子节点的最长路径(变数);从下至上;叶子节点为零

节点的深度:根节点到这个节点所经历的边的个数;从上之下;根节点为零

节点的层数:节点的深度+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节点
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值