二叉树打印
前言
在总结查找算法时,发现对二叉树总是看画图和文字描述,真正上手实现的机会并不太多,于是就根据自己理解实现了一下二叉树的相关操作。
限于个人水平,理论和代码可能存在缺陷,欢迎提出并讨论。
代码结构
import java.util.LinkedList;
import java.util.Queue;
public class MySeek {
public static void main(String[] args) {
int[] list1 = {
0, 1, 2, 3 };
int[] list2 = {
6, 3, 2, 8, 5, 9, 0, 1, 7, 4 };
tree(list1);
tree(list2);
}
}
树结构
// 二叉查找树结构
private static class TreeNode {
private int value;
private TreeNode left;
private TreeNode right;
public TreeNode() {
}
public TreeNode(int value) {
this.value = value;
}
//省略get()、set()
}
二叉树查找
/*
* 二叉树查找
* 时间复杂度:O(logn)~O(n)
*/
public static void tree(int[] li, int count) {
// 构建树
TreeNode head = new TreeNode(li[0]);
makeTree(head, li, 1);
while (head != null) {
if (head.getValue() == count) {
System.out.println("二叉树查找:查找成功,序列中存在" + count);
return;
} else if (head.getValue() > count) {
head = head.getLeft();
} else {
head = head.getRight();
}
}
System.out.println("二叉树查找:查找失败,序列中不存在" + count);
}
STEP1 — 种一棵树
怎么在线性表查找不难,怎么在二叉树中查找也不难,不过给出一个线性表要转化成二叉树就需要用递归一个个放到只有根节点的树中。
顺序表转化为二叉树
/*
* 将顺序表转化为二叉查找树
* head 根节点
* li 线性表
* key 准备插入二叉树的元素位置
*/
public static void makeTree(TreeNode head, int[] li, int key) {
// 递归结束条件
if (key >= li.length) {
return;
}
// 复制头结点向下遍历
TreeNode node = head;
// 准备插入的子结点
TreeNode newNode = new TreeNode(li[key]);
while (node != null) {
if (node.value > newNode.value) {
// 左子树