数据结构之二叉树
一、二叉树示意图:
二、二叉树定义
二叉树(binary tree)是指树中节点的度不大于2的有序树,它是一种最简单且最重要的树。
二叉树的递归定义为:二叉树是一棵空树,或者是一棵由一个根节点和两棵互不相交的,分别称作根的左子树和右子树组成的非空树;左子树和右子树又同样都是二叉树。
三、二叉树的节点:TreeNode
//定义
private Integer data;//数据
private TreeNode left;//左节点
private TreeNode right;//右节点
四、添加构造方法、set、get方法
//构造方法
public TreeNode(Integer data) {
this.data = data;
}
//get set 方法
public Integer getData() {
return data;
}
public void setData(Integer 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 rigut) {
this.right = rigut;
}
五、二叉树遍历:Ergodic
(一)、广度遍历(层次遍历):按层打印
public static void printByLayer(TreeNode root){
//空树
if(root == null){
return ;
}
//创建一个队列存储节点:先进先出
//定义一个队列
Queue<TreeNode> queue = new LinkedList<>();
//将根节点放入队列
queue.add(root);
//判断是否为空
while (!queue.isEmpty()){
//从队列中取数据
TreeNode temp = queue.poll();
System.out.println(temp.getData());
//管理自己的子节点
if(temp.getLeft() != null){
queue.add(temp.getLeft());
}
if(temp.getRight() != null){
queue.add(temp.getRight());
}
}
}
(二)、深度遍历
1、先序遍历:根左右
public static void pre_print(TreeNode root){
if(root != null){
//根
System.out.println(root.getData());
//左
if(root.getLeft() != null){
pre_print(root.getLeft());
}
//右
if(root.getRight() != null){
pre_print(root.getRight());
}
}
}
2、中序遍历:左根右
public static void mid_print(TreeNode root){
if(root != null){
//左
if(root.getLeft() != null){
mid_print(root.getLeft());
}
//根
System.out.println(root.getData());
//右
if(root.getRight() != null){
mid_print(root.getRight());
}
}
}
3、后序遍历:左右根
public static void last_print(TreeNode root){
if(root != null){
//左
if(root.getLeft() != null){
last_print(root.getLeft());
}
//右
if(root.getRight() != null){
last_print(root.getRight());
}
//根
System.out.println(root.getData());
}
}
二、二叉排序数:BinarySortTree
(一)、定义根节点:root
private TreeNode root;
(二)、添加数据
public boolean add(Integer data){
if(root == null){
this.root = new TreeNode(data);
}else{
TreeNode current = root;
TreeNode parentNode = null;
while (current != null){
parentNode = current;
if (data < current.getData()){
current = current.getLeft();
if(current == null){
parentNode.setLeft(new TreeNode(data));
return true;
}
}else{
current = current.getRight();
if(current == null){
parentNode.setRight(new TreeNode(data));
return true;
}
}
}
}
return false;
}
(三)、查询数据
public TreeNode get(Integer key){
TreeNode temp = root;
while (temp != null){
if(temp.getData() > key){
temp = temp.getLeft();
}else if (temp.getData() < key){
temp = temp.getRight();
}else{
return temp;
}
}
return null;
}
三、测试类
(一)、创建节点
//创建根节点
TreeNode root = new TreeNode(1);
//创建叶子节点
TreeNode node2 = new TreeNode(2);
TreeNode node3 = new TreeNode(3);
TreeNode node4 = new TreeNode(4);
TreeNode node5 = new TreeNode(5);
TreeNode node6 = new TreeNode(6);
TreeNode node7 = new TreeNode(7);```
(二)、构建二叉树
//将节点构建成为一棵树
root.setLeft(node2);
root.setRight(node3);
node2.setLeft(node4);
node2.setRight(node5);
node3.setLeft(node6);
node3.setRight(node7);