数据结构与算法之美 | 学习笔记19 —— 二叉树基础

一、树

数据结构与算法之美 | 学习笔记19 —— 二叉树基础_第1张图片
首先明确概念:A是B的父节点,B是A的子节点,B、C、D相互为兄弟节点,没有父节点的E叫根节点,没有子节点的G、H、I、J、K、L叫叶子节点
数据结构与算法之美 | 学习笔记19 —— 二叉树基础_第2张图片
这里有一些个举例:
数据结构与算法之美 | 学习笔记19 —— 二叉树基础_第3张图片

二、二叉树(Binary Tree)

二叉树,每个结点最多有两个子节点,分别为左子节点和右子节点。
数据结构与算法之美 | 学习笔记19 —— 二叉树基础_第4张图片
上图中编号2除叶子结点外,每个都有2个子节点,为满二叉树,编号3除了最后一层,结点个数都达到最大,最后一层叶子结点靠左排列,为完全二叉树

1. 存储二叉树

链式存储法

数据结构与算法之美 | 学习笔记19 —— 二叉树基础_第5张图片
每个节点有三个字段,一个存储数据,另两个指向左右子节点的指针。这种存储方式比较常用。

顺序存储法

数据结构与算法之美 | 学习笔记19 —— 二叉树基础_第6张图片
根节点存储在下标 i = 1 i=1 i=1的位置,左子节点存储在 2 ∗ i = 2 2*i=2 2i=2的位置,右子节点存储在 2 ∗ i + 1 = 3 2*i+1=3 2i+1=3的位置,依次类推,I节点的父节点D的下标 i = 4 i=4 i=4,I节点就存储在 4 ∗ 2 + 1 = 9 4*2+1=9 42+1=9的位置。
这种方法对于非完全二叉树,会有很多位置为空,浪费数组资源。

2. 二叉树的遍历

二叉树的前、中、后序遍历是一个递归过程
前序遍历:对树的任意节点,打印顺序:这个节点->它的左子树->它的右子树
中序遍历:对树的任意节点,打印顺序:它的左子树->这个节点->它的右子树
后序遍历:对树的任意节点,打印顺序:它的右子树->这个节点->它的左子树
数据结构与算法之美 | 学习笔记19 —— 二叉树基础_第7张图片

前序遍历的递推公式:
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节点
}

二叉树遍历的时间复杂度
从遍历顺序图,每个节点最多会被访问两次,遍历操作的时间复杂度跟节点数n成正比,因此整个二叉树遍历的时间复杂度为 O ( n ) O(n) O(n)

你可能感兴趣的:(数据结构)