数据结构--二叉树

来源:互联网 发布:两组数据相似性分析 编辑:程序博客网 时间:2024/05/21 18:38

1. 树基本概念:

  • 根节点(root)、叶节点(leaf)、儿子(child)、父亲(parent)、兄弟(sibling)、祖父(grandparent)、孙子(grandchild)、边(edge)、路径(path)
  • 路径的长(length):路径上边的条数。
  • 祖先(ancestor)和后裔(descendant):存在节点a到节点b的一条路径a –> b,则a是b的祖先,b是a的后裔。
  • 真祖先(proper ancestor)和真后裔(proper descendant):a != b且存在节点a到节点b的一条路径a –> b,则a是b的真祖先,b是a的真后裔。
  • 节点的深度(depth):节点a的深度为从根节点到a节点的唯一路径(path)的长。根节点的深度是0。需要注意的是路径的长,不是节点的个数。
  • 节点的高度(height):节点a的高度是节点a到一片树叶(只能往下看,不能回溯)的最长路径的长。所有叶节点的height都是0。同样的,定义的是路径的长,不是节点的个数。

2. 二叉树的定义及遍历

这里写图片描述

struct TreeNode {    int            val;    TreeNode*    left;    TreeNode*    right;    TreeNode(int x): val(x), left(NULL),right(NULL) {}};

3. 二叉树的遍历

3.1. 二叉树的前序遍历(深度优先遍历DFS)

遍历顺序:父节点 –> 左孩子 –> 右孩子
实现细节见我之前写的LeetCode题解,里面有详细解答,包括递归实现、迭代实现、线索二叉树实现。
[LeetCode]144. Binary Tree Preorder Traversal–二叉树前序遍历

3.2. 二叉树的中序遍历(深度优先遍历DFS)

遍历顺序:左孩子 –> 父节点 –> 右孩子
实现细节见我之前写的LeetCode题解
[LeetCode]94. Binary Tree Inorder Traversal–二叉树的中序遍历

3.3. 二叉树的后序遍历(深度优先遍历DFS)

遍历顺序:左孩子 –> 右孩子 –> 父节点
实现细节见我之前写的LeetCode题解
[LeetCode]145. Binary Tree Postorder Traversal–二叉树的后序遍历

3.4. 二叉树的层序遍历(宽度优先遍历WFS)

[LeetCode]102. Binary Tree Level Order Traversal–二叉树层序遍历1
[LeetCode]107. Binary Tree Level Order Traversal II–二叉树层序遍历2
[LeetCode]103. Binary Tree Zigzag Level Order Traversal–二叉树之字形遍历

3.5. 表达式树

这里写图片描述
表达式树(expression tree):表达式树的树叶是操作数(operand),比如常量或变量;其他的节点为操作符(operator)。
根据不同的遍历顺产生不同的表达式。
前缀表达式(前序遍历):++a*bc*+*defg
中缀表达式(中序遍历):a+b*c+d*e+f*g
后缀表达式(后序遍历):abc*+de*f+g*+
后缀表达式也叫逆波兰表达式。

  1. Evaluate Reverse Polish Notation

4. 二叉搜索树/二叉查找树(Binary Search Tree)的定义

5. 二叉搜索树/二叉查找树的基本操作:

5.1. 清空:make_empty

5.2. 插入:insert

5.3. 查找:find

5.4. 查找最小元素:find_min

5.5. 查找最大元素:find_max

5.6. 删除:delete

5.7. 时间复杂度/空间复杂度的分析

6. AVL树定义

6.1 单旋转

6.2 双旋转

7. 伸展树

8. B-树

原创粉丝点击