二叉树概念
二叉树(Binary tree)是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。二叉树特点是每个结点最多只能有两棵子树,且有左右之分 [1] 。
二叉树是n个有限元素的集合,该集合或者为空、或者由一个称为根(root)的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成,是有序树。当集合为空时,称该二叉树为空二叉树。在二叉树中,一个元素也称作一个结点
tips
: 本篇主要围绕二叉树的创建与递归遍历展开学习 未涉及概念性的知识
预览
- 三步创建二叉树
- 二叉树创建过程图解
- 二叉树遍历图解与实现代码
三步创建二叉树
创建树节点
public class MyTreeNode {
// 树的值
private Integer num;
// 左子树
private MyTreeNode leftNode;
// 右子树
private MyTreeNode rightNode;
public MyTreeNode(Integer num) {
this.num = num;
}
public Integer getNum() {
return num;
}
public void setNum(Integer num) {
this.num = num;
}
public MyTreeNode getLeftNode() {
return leftNode;
}
public void setLeftNode(MyTreeNode leftNode) {
this.leftNode = leftNode;
}
public MyTreeNode getRightNode() {
return rightNode;
}
public void setRightNode(MyTreeNode rightNode) {
this.rightNode = rightNode;
}
@Override
public String toString() {
return "MyTreeNode{" +
"num=" + num +
", leftNode=" + leftNode +
", rightNode=" + rightNode +
'}';
}
}
创建树
package binary_tree;
public class BinaryTree {
// 根节点
private MyTreeNode rootNode;
public MyTreeNode getRootNode() {
return rootNode;
}
public void setRootNode(MyTreeNode rootNode) {
this.rootNode = rootNode;
}
@Override
public String toString() {
return "BinaryTree{" +
"rootNode=" + rootNode +
'}';
}
}
创建测试类与二叉树插值的方法
public class MyTest_Tree {
public static void main(String[] args) {
List<Integer> list = Arrays.asList(15, 20, 12, 30, 28, 54, 29,27,26, 1);
// 将list转换为二叉树
BinaryTree tree = new BinaryTree();
list.forEach(x -> insert(x, tree))
}
// 二叉树插入值
public static void insert(Integer num, BinaryTree tree) {
if (tree == null || num == null) return;
// 获取根节点
MyTreeNode rootNode = tree.getRootNode();
if (rootNode == null) {
tree.setRootNode(new MyTreeNode(num));
return;
}
//生成子节点
MyTreeNode tempNode = rootNode;
while (tempNode != null) {
// 相同值跳出
if (num == tempNode.getNum()) break;
// 往左边插入
if (tempNode.getNum() > num) {
if (tempNode.getLeftNode() == null) {
tempNode.setLeftNode(new MyTreeNode(num));
break;
}
tempNode = tempNode.getLeftNode();
}
// 往右边插入
if (tempNode.getNum() < num) {
if (tempNode.getRightNode() == null) {
tempNode.setRightNode(new MyTreeNode(num));
break;
}
tempNode = tempNode.getRightNode();
}
}
}
}
至此 二叉树创建完毕 根据上面的插值方法 生成的二叉树如下
生成树的步骤如下
取出数组中的第一个元素15 将其设置为根节点
依次取出数组中的第二个元素 20 此时20 大于根节点的15 将其放到15的右子树节点
取出第三个元素12 12小于根节点的20 将其置为15的左子树
取出第四个元素30 30大于根节点的15 将其放置右子树 此时右子树已经存在20 30需要依次比较
此时30大于20 将其放置20的右子树
剩余数据依次如图所示…
二叉树遍历
目前二叉树遍历的主要几种方式分别为递归、基于栈、基于队列进行遍历。本篇主要提供集中递归遍历的思路。
前序遍历
前序遍历的主要顺序为 左 根 右
基于上图最终生成的树而言 前序输出的结果应为 1 12 15 20 26 27 28 29 30 54
public static void before(MyTreeNode tree) {
if (tree == null || tree.getNum() == null) return;
mid(tree.getLeftNode()); //
System.out.println(tree.getNum());
mid(tree.getRightNode());
}
中序遍历
中序遍历主要顺序为 根 左 右
基于上图最终生成的树而言 中序输出的结果应为 15 12 1 20 30 28 27 26 29 54
public static void mid(MyTreeNode tree) {
if (tree == null || tree.getNum() == null) return;
System.out.println(tree.getNum());
mid(tree.getLeftNode());
mid(tree.getRightNode());
}
后序遍历
后序遍历的顺序为 左 右 根
基于上图最终生成的树而言 后序输出的结果应为 1 12 26 27 29 28 54 30 20 15
public static void after(MyTreeNode tree) {
if (tree == null || tree.getNum() == null) return;
after(tree.getLeftNode());
after(tree.getRightNode());
System.out.println(tree.getNum());
}