基础理论
二叉树的种类
在解题过程中二叉树有两种主要的形式:满二叉树和完全二叉树。
满二叉树
如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树
![](https://i-blog.csdnimg.cn/blog_migrate/551c31c32003553954ffaac9db6d876f.png)
完全二叉树
除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。也就是说完全二叉树的底层不一定满,但一定是从左到右连续的。
![](https://i-blog.csdnimg.cn/blog_migrate/2e63ff23d54a40bd9cfd363f209da609.png)
二叉搜索树
二叉搜索树节点是有数值的,二叉搜索树是一个有序树
节点有顺序,左子树所有节点都小于中间节点,右子树所有节点都大于中间节点。
![](https://i-blog.csdnimg.cn/blog_migrate/a80a4e4eb872dcaafb10d88e170ca2eb.png)
平衡二叉搜索树
又被称为AVL(Adelson-Velsky and Landis)树,左子树和右子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
![](https://i-blog.csdnimg.cn/blog_migrate/a4261d1d68f0b4032ccc94f34eb0eb55.png)
二叉树的存储方式
二叉树可以链式存储,也可以顺序存储。
链式存储方式就用指针, 顺序存储的方式就是用数组。
一般我们选择链式存储
二叉树的定义
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode() {}
TreeNode(int val) { this.val = val; }
TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}
二叉树的遍历
深度优先搜索:一个方向搜到终点再回退,换下一个方向一直搜到终点,如前中后序遍历(递归法、迭代法)
广度优先搜索:一层一层或一圈一圈的去遍历,如层序遍历(迭代法)
递归遍历
前序遍历(中左右子树的顺序)
后序遍历(左右中)
中序遍历(左中右)
![](https://i-blog.csdnimg.cn/blog_migrate/9fadfbc1b5f012d98597ca25803e6b22.png)
144.二叉树的前序遍历
![](https://i-blog.csdnimg.cn/blog_migrate/0a6203220195de437aae57096fe41a9a.png)
94.二叉树的中序遍历
![](https://i-blog.csdnimg.cn/blog_migrate/960e53b13fc633775df8dad202a42c92.png)
145.二叉树的后序遍历
![](https://i-blog.csdnimg.cn/blog_migrate/e35bab71933aa06abb345504f572e741.png)