学习数据结构笔记 --- [二叉树学习(BinaryTree)]
Posted 小智RE0
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学习数据结构笔记 --- [二叉树学习(BinaryTree)]相关的知识,希望对你有一定的参考价值。
B站学习传送门–>尚硅谷Java数据结构与java算法(Java数据结构与算法)
ml
1.初步学习二叉树
注意,从二叉树的基础开始
二叉树;在根节点的基础上;
- 根节点左边的节点一般称为左子树;
- 根节点右边的节点一般称为右子树;
- 每一部分单独取出都能看做一颗二叉树
满二叉树:所有的根结点都挂有左子树和右子树
2.初步实现二叉树的前序,中序,后序遍历
本次先手动创建二叉树; 主要是学习二叉树的前序,中序,后序遍历思想
图解
先对之前这个图进行分析;
前序遍历:
获取输出顺序: 根结点(中间的节点)
—> 左子树
—>右子树
例如:刚才创建的二叉树进行前序遍历的话;
就得输出 13 --> 11 --> 8 --> 12 --> 75 --> 14 --> 100
中序遍历:
获取输出顺序; 左子树
—> 中心节点
—> 右子树
例如刚才的二叉树进行中序遍历就是;
8 --> 11 --> 12 --> 13 --> 14 --> 75 --> 100
后序遍历;
输出顺序: 左子树
—> 右子树
—> 中心节点
刚才的二叉树输出顺序为;
8 --> 12 --> 11 --> 14 --> 100 --> 75 --> 13
简易实现前中后序遍历
/**
* @author by CSDN@小智RE0
* @date 2021-11-10 18:10
*/
public class DemoTree {
public static void main(String[] args) {
//手动创建二叉树;
BinarTree btree = new BinarTree();
//先创建节点;
Node root = new Node(13);
Node node1 = new Node(11);
Node node2 = new Node(75);
Node node3 = new Node(8);
Node node4 = new Node(12);
Node node5 = new Node(14);
Node node6 = new Node(100);
//手动挂接子节点;
root.setLeft(node1);
root.setRight(node2);
node1.setLeft(node3);
node1.setRight(node4);
node2.setLeft(node5);
node2.setRight(node6);
btree.setRoot(root);
System.out.println("简易的前序遍历---");
btree.prefixList();
System.out.println("简易的中序遍历---");
btree.infixList();
System.out.println("简易的后序遍历---");
btree.suffixList();
}
}
//二叉树;
class BinarTree {
//根结点;
public Node root;
//设置根结点;
public void setRoot(Node root) {
this.root = root;
}
//前序遍历;
public void prefixList() {
if (root == null) {
System.out.println("空树,不遍历");
} else {
this.root.prefixList();
}
}
//中序遍历;
public void infixList() {
if (root == null) {
System.out.println("空树,不遍历");
} else {
this.root.infixList();
}
}
//后序遍历;
public void suffixList() {
if (root == null) {
System.out.println("空树,不遍历");
} else {
this.root.suffixList();
}
}
}
//节点;
class Node {
//节点的值;
private int val;
//左子树,右子树;
private Node left;
private Node right;
public Node(int val) {
this.val = val;
}
public int getVal() {
return val;
}
public void setVal(int val) {
this.val = val;
}
public Node getLeft() {
return left;
}
public void setLeft(Node left) {
this.left = left;
}
public Node getRight() {
return right;
}
public void setRight(Node right) {
this.right = right;
}
@Override
public String toString() {
return "Node{" + "val=" + val + '}';
}
//前序遍历; 中-->左-->右;
public void prefixList() {
//中心节点先输出;
System.out.println(this);
if (this.left != null) {
//去左子树;
this.left.prefixList();
}
if (this.right != null) {
//去右子树;
this.right.prefixList();
}
}
//中序遍历; 左-->中-->右;
public void infixList() {
//先去左子树;
if (this.left != null) {
this.left.infixList();
}
//中心节点;
System.out.println(this);
//在去右子树;
if (this.right != null) {
this.right.infixList();
}
}
//后序遍历; 左-->右-->中;
public void suffixList() {
//左子树;
if (this.left != null) {
this.left.suffixList();
}
//右子树;
if (this.right != null) {
this.right.suffixList();
}
//中心点输出
System.out.println(this);
}
}
测试结果;
简易的前序遍历---
Node{val=13}
Node{val=11}
Node{val=8}
Node{val=12}
Node{val=75}
Node{val=14}
Node{val=100}
简易的中序遍历---
Node{val=8}
Node{val=11}
Node{val=12}
Node{val=13}
Node{val=14}
Node{val=75}
Node{val=100}
简易的后序遍历---
Node{val=8}
Node{val=12}
Node{val=11}
Node{val=14}
Node{val=100}
Node{val=75}
Node{val=13}
3.初步实现二叉树的前序查找,中序查找;后序查找;
那么这个前序查找,中序查找,后序查找时,就得根据他这个遍历时的顺序一样;一步步查找即可;
前序查找
- 首先就判断当前的这个结点是否符合;
- 若当前结点不符合,就先判断左子树是否为空;若不为空则在左子树向下进行递归;
- 若在左子树递归后找到要查找的节点;就直接返回,
- 若没有在左子树下找到,就去判断右子树是否为空,不为空就去递归查找;
- 最终若还是没有找到,返回一个空节点.
中序查找
- 首先判断当前结点的左子树是否为空;不为空就进行递归;
- 若在左子树递归找到就直接返回;
- 判断当前结点是否符合;
- 再去判断当前结点的右子树是否为空,不为空就进行递归;
- 最终还未找到,返回一个空节点;
后序查找
- 首先判断当前结点的左子树是否为空,不为空就进行递归;
- 若在左子树递归找到就直接返回;
- 再去判断当前结点的右子树是否为空;不为空就进行递归;
- 若在右子树递归找到就直接返回;
- 判断当前结点是否符合;
- 最终还未找到,返回一个空节点.
/**
* @author by CSDN@小智RE0
*/
public class DemoTree {
public static void main(String[] args) {
//手动创建二叉树;
BinarTree btree = new BinarTree();
//先创建节点;
Node root = new Node(13);
Node node1 = new Node(11);
Node node2 = new Node(75);
Node node3 = new Node(8);
Node node4 = new Node(12);
Node node5 = new Node(14);
Node node6 = new Node(100);
//手动挂接子节点;
root.setLeft(node1);
root.setRight(node2);
node1.setLeft(node3);
node1.setRight(node4);
node2.setLeft(node5);
node2.setRight(node6);
btree.setRoot(root);
System.out.println("前序查找测试--->");
btree.prefixSearch(14);
System.out.println("中序查找测试--->");
btree.infixSearch(14);
System.out.println("后序查找测试--->");
btree.suffixSearch(14);
}
}
//二叉树;
class BinarTree {
//根结点;
public Node root;
//设置根结点;
public void setRoot(Node root) {
this.root = root;
}
//前序查找;
public void prefixSearch(int val) {
if (root == null) {
System.out.println("空树,不用查找");
} else {
Node node = this.root.prefixSearch(val);
if (node == null) {
System.out.println("没有找到");
} else {
System.out.println("已找到节点" + node.getVal());
}
}
}
//中序查找;
public void infixSearch(int val) {
if (root == null) {
System.out.println("空树,不用查找");
} else {
Node node = this.root.infixSearch(val);
if (node == null) {
System.out.println("没有找到");
} else {
System.out.println("已找到节点" + node.getVal());
}
}
}
//后序查找;
public void suffixSearch(int val) {
if (root == null) {
System.out.println("空树,不用查找");
} else {
Node node = this.root.suffixSearch(val);
if (node == null) {
System.out.println("没有找到");
} else {
System.out.println("已找到节点" + node.getVal());
}
}
}
}
//节点;
class Node {
//节点的值;
private int val;
//左子树,右子树;
private Node left;
private Node right;
public Node(int val) {
this.val = val;
}
public int getVal() {
return val;
}
public void setVal(int val) {
this.val = val;
}
public Node getLeft() {
return left;
}
public void setLeft(Node left) {
this.left = left;
}
public Node getRight() {
return right;
}
public void setRight(Node right) {
this.right = right;
}
@Override
public String toString() {
return "Node{" + "val=" + val + '}';
}
//前序查找步骤;
public Node prefixSearch(int val) {
//前序遍历时, 中-->左-->右;
System.out.println("正在前序查找中------>");
//1.先判断当前结点是否为空;
if (this.val == val) {
return this;
}
Node resultNode = null;
//若不符合,则先看左子树是否为null; 不为空则向左一直递归;
if (this.left != null) {
resultNode = this.left.prefixSearch(val);
}
//在左子树找到就提前返回;
if (resultNode != null) {
return resultNode;
}
//若左子树未找到则在右子树递归查找;
//看右子树是否为空;
if (this.right != null) {
resultNode = this.right.prefixSearch(val);
}
//最终再返回这个查询的节点;若为null就是没找到;
return resultNode;
}
//中序查找步骤;
public Node infixSearch(int val) {
//中序遍历时;左-->中-->右;
Node resultNode = null;
//先判断左子树是否为空;不为空再去查找;
if (this.left != null) {
resultNode = this.left.infixSearch(val);
}
//若已找到,就提前返回;
if (resultNode != null) {
return resultNode;
}
System.out.println("正在中序查找中------>");
//判断当前节点是否符合;
if (this.val == val) {
return this;
}
//判断右子树是否为空,再去递归查找;
if (this.right != null) {
resultNode = this.right.infixSearch(val);
}
//最终返回结果节点;若为null则就是没找到;
return resultNode;
}
//后序查找步骤;
public Node suffixSearch(int val) {
//后序遍历时,左-->右 -->中;
Node resultNode = null;
//同样地,先判断左子树是否为空;
if (this.left != null) {
resultNode = this.left.suffixSearch(val);
}
以上是关于学习数据结构笔记 --- [二叉树学习(BinaryTree)]的主要内容,如果未能解决你的问题,请参考以下文章