一、二叉树是什么
- 一种特殊的树形结构,每个节点至多只有两颗子树 (只有一个也是二叉树)。
- 下面这个也是二叉树。
二、二叉树基本概念
-
结点:树里面的元素。
-
结点的高度:结点到叶子结点的最长路径
-
结点的深度:根结点到该结点的边个数
-
结点的层数:结点的深度加1
-
树的高度:根结点的高度。
-
注:树的高度是根节点的高度,之前的针对结点,第5个是针对树
-
最后再放一张图便于理解。
-
其实我感觉这里可以这么理解,就把根节点当成是地平线,二叉树就是根,那些个结点就是根瘤菌,那个根瘤菌的深度就是,地平线到这个根瘤菌的长度(边的个数)
-
高度的话,肯定就是以最下面的根瘤菌为基准了,就是这个根瘤菌到最下面根瘤菌的距离
10.层数就是把地平线也算一层,就是深度加1。
三、二叉树分类
- 满二叉树
- 完全二叉树(也属于满二叉树)也叫堆,下边这两个都是完全二叉树
四、二叉树的遍历
前序遍历
- 如上图所示,前序遍历总结一下就是根左右
- 根节点输出
- 如果到了左边的节点,就把那个结点当作根节点,剩下的作为子树继续遍历
- 以上述二叉树为例,最开始把A输出之后
- 就到了左节点B,然后把B以下的节点作为一颗子树,进行前序遍历。
- 如下图
- 然后,直到遍历到D,开始遍历右节点E了。
- 所以其代码为:
// 前序遍历
public void pre(TreeNode root) {
// 根节点输出
printNode(root);
//左
if (root.getLeft() != null) {
//把左边结点当作根节点,以前序遍历的方式遍历以其作为节点的子树
pre(root.getLeft());
}
//右
if (root.getRight() != null) {
//把右边结点当作根节点,以前序遍历的方式遍历以其作为节点的子树
pre(root.getRight());
}
}
中序遍历
- 左根右
- 中序遍历和前序遍历差不多,只是根节点是在左边子树遍历之后才输出,然后在遍历右边子树
- 其代码为:
// 中序遍历
public void mid(TreeNode root) {
// 左
if (root.getLeft() != null) {
mid(root.getLeft());
}
// 根
printNode(root);
// 右
if (root.getRight() != null) {
mid(root.getRight());
}
}
、
后序遍历
- 左右根
- 这个是最后输出根节点,先遍历左子树,在遍历右子树
- 代码:
// 后序遍历
public void post(TreeNode root) {
// 左
if (root.getLeft() != null) {
post(root.getLeft());
}
// 右
if (root.getRight() != null) {
post(root.getRight());
}
// 根
printNode(root);
}
遍历的完整代码
public class BinaryTree {
// 打印
public void printNode(TreeNode node) {
System.out.print(node.getData());
}
// 前序遍历
public void pre(TreeNode root) {
// 根节点输出
printNode(root);
//左
if (root.getLeft() != null) {
pre(root.getLeft());
}
//右
if (root.getRight() != null) {
pre(root.getRight());
}
}
// 中序遍历
public void mid(TreeNode root) {
// 左
if (root.getLeft() != null) {
mid(root.getLeft());
}
// 根
printNode(root);
// 右
if (root.getRight() != null) {
mid(root.getRight());
}
}
// 后序遍历
public void post(TreeNode root) {
// 左
if (root.getLeft() != null) {
post(root.getLeft());
}
// 右
if (root.getRight() != null) {
post(root.getRight());
}
// 根
printNode(root);
}
public static void main(String[] args) {
//创建二叉树
TreeNode D = new TreeNode('D',null,null);
TreeNode E = new TreeNode('E',null,null);
TreeNode B = new TreeNode('B',D,E);
TreeNode F = new TreeNode('F',null,null);
TreeNode G = new TreeNode('G',null,null);
TreeNode C = new TreeNode('C',F,G);
TreeNode A = new TreeNode('A',B,C);
BinaryTree binary = new BinaryTree();
binary.pre(A);
System.out.println();
binary.mid(A);
System.out.println();
binary.post(A);
}
}
class TreeNode {
private char data;
private TreeNode left;
private TreeNode right;
TreeNode(char data, TreeNode left, TreeNode right) {
this.data = data;
this.left = left;
this.right = right;
}
public char getData() {
return data;
}
public void setData(char data) {
this.data = data;
}
public TreeNode getLeft() {
return left;
}
public void setLeft(TreeNode left) {
this.left = left;
}
public TreeNode getRight() {
return right;
}
public void setRight(TreeNode right) {
this.right = right;
}
}