二叉树
二叉树是每个结点最多有两个子树的树结构
顺序存储
- 顺序存储通常只考虑完全二叉树,下标与数组一样,从0开始
- 第n个节点的左子节点下标为 (2 * n + 1)
- 第n个节点的右子节点下标为 (2 * n + 2)
- 第n个节点的父节点下标为 (n-1) / 2
可以看出顺序存储有很大的局限性,只有在存储完全二叉树的时候会比较实用,存储其他的二叉树,也要按照完全二叉树的形式来存储,会特别浪费空间,存储很多无效节点,树的层数越高,需要的空间就越大。
作用:堆排序 堆排序算法(Java实现)
链式存储
通过引用指向左右子节点,常用的存储方式,节约空间。
基本操作:
package com.lcb.tree;
public class BinaryTree {
private TreeNode root;
public TreeNode getRoot() {
return root;
}
public void setRoot(TreeNode root) {
this.root = root;
}
//前序删除
public boolean preRemove(int id) {
if(this.root != null) {
return this.root.preRemove(id);
}else {
System.out.println("二叉树为空!");
return false;
}
}
//前序查找
public TreeNode preFind(int id) {
if(this.root != null) {
return this.root.preFind(id);
}else {
System.out.println("二叉树为空!");
return null;
}
}
//前序遍历
public void preOrder() {
if(this.root != null) {
this.root.preOrder();
}else {
System.out.println("二叉树为空!");
}
}
//中序遍历
public void midOrder() {
if(this.root != null) {
this.root.midOrder();
}else {
System.out.println("二叉树为空!");
}
}
//后序遍历
public void rearOrder() {
if(this.root != null) {
this.root.rearOrder();
}else {
System.out.println("二叉树为空!");
}
}
}
class TreeNode{
private Integer id;
private String name;
private TreeNode left;
private TreeNode right;
public TreeNode(Integer id, String name) {
super();
this.id = id;
this.name = name;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
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;
}
@Override
public String toString() {
return "TreeNode [id=" + id + ", name=" + name + "]";
}
//按前序顺序删除
public boolean preRemove(int id) {
boolean res = false;
if(this.left != null && this.left.id == id) {
this.left = null;
return true;
}
if(this.right != null && this.right.id == id) {
this.right = null;
return true;
}
if(this.left != null && res == false) {
res = this.left.preRemove(id);
}
if(this.right != null && res == false) {
res = this.right.preRemove(id);
}
return res;
}
//按前序顺序查找
public TreeNode preFind(int id) {
if(this.id == id) {
return this;
}
TreeNode res = null;
if(this.left != null && res == null) {
res = this.left.preFind(id);
}
if(this.right != null && res == null) {
res = this.right.preFind(id);
}
return res;
}
//前序遍历
public void preOrder() {
System.out.println(this);
if(this.left != null) {
this.left.preOrder();
}
if(this.right != null) {
this.right.preOrder();
}
}
//中序遍历
public void midOrder() {
if(this.left != null) {
this.left.midOrder();
}
System.out.println(this);
if(this.right != null) {
this.right.midOrder();
}
}
//后序遍历
public void rearOrder() {
if(this.left != null) {
this.left.rearOrder();
}
if(this.right != null) {
this.right.rearOrder();
}
System.out.println(this);
}
}