一.什么是二叉树
数的每个子节点最多有两个子节点的树称为二叉树
二.二叉树的操作
一.插入节点
从根节点开始查找一个相应的节点,这个节点将成为新插入节点的父节点。当父节点找到后,通过判断节点的值比父节点的值的大小来决定是连接到左子节点还是右子节点。
二.查找节点
从根节点开始查找,如果查找的节点值比当前节点的值小,则继续查找其左子树,否则查找其右子树。
三.遍历二叉树
如构建一颗树:
前序遍历:10 3 4 20 15 90
中序遍历:3 4 10 15 20 90 (看出中序遍历结果是从小到大进行了排序)
后序遍历:4 3 15 90 20 10
四.代码实现:
二叉树节点
Node.java: 此类中左子节点,右子节点和数据项
package ch12;
/*
* 二叉树节点
*/
public class Node {
//数据项
public long data;
//数据项
public String sData;
//左子节点
public Node leftChild;
//右子节点
public Node rightChild;
/**
* 构造方法
* @param data
*/
public Node(long data,String sData) {
this.data = data;
this.sData = sData;
}
}
二叉树类:
package ch12;
/*
* 二叉树类
*/
public class Tree {
//根节点
public Node root;
/**
* 插入节点
* @param value
*/
public void insert(long value,String sValue) {
//封装节点
Node newNode = new Node(value,sValue);
//引用当前节点
Node current = root;
//引用父节点
Node parent;
//如果root为null,也就是第一插入的时候
if(root == null) {
root = newNode;
return;
} else {
while(true) {
//父节点指向当前节点
parent = current;
//如果当前指向的节点数据比插入的要大,则向左走
if(current.data > value) {
current = current.leftChild;
if(current == null) {
parent.leftChild = newNode;
return;
}
} else {
current = current.rightChild;
if(current == null) {
parent.rightChild = newNode;
return;
}
}
}
}
}
/**
* 查找节点
* @param value
*/
public Node find(long value) {
//引用当前节点,从根节点开始
Node current = root;
//循环,只要查找值不等于当前节点的数据项
while(current.data != value) {
//进行比较,比较查找值和当前节点的大小
if(current.data > value) {
current = current.leftChild;
} else {
current = current.rightChild;
}
//如果查找不到
if(current == null) {
return null;
}
}
return current;
}
/**
* 删除节点
* @param value
*/
public void delte(long value) {
}
/**
* 前序遍历
*/
public void frontOrder(Node localNode) {
if(localNode != null) {
//访问根节点
System.out.println(localNode.data + ", " + localNode.sData);
//前序遍历左子树
frontOrder(localNode.leftChild);
//前序遍历右子树
frontOrder(localNode.rightChild);
}
}
/**
* 中序遍历
*/
public void inOrder(Node localNode) {
if(localNode != null) {
//中序遍历左子树
inOrder(localNode.leftChild);
//访问根节点
System.out.println(localNode.data + ","+localNode.sData);
//中序遍历右子树
inOrder(localNode.rightChild);
}
}
/**
* 后序遍历
*/
public void afterOrder(Node localNode) {
if(localNode != null) {
//后序遍历左子树
afterOrder(localNode.leftChild);
//后序遍历右子树
afterOrder(localNode.rightChild);
//访问根节点
System.out.println(localNode.data+","+localNode.sData);
}
}
}
// A code block
var foo = 'bar';
测试类:
package ch12;
public class TestTree {
public static void main(String[] args) {
Tree tree = new Tree();
tree.insert(10,"James");
tree.insert(20,"YAO");
tree.insert(15,"Kobi");
tree.insert(3,"Mac");
tree.insert(4,"Zhangsan");
tree.insert(90,"List");
/*
System.out.println(tree.root.data);
System.out.println(tree.root.rightChild.data);
System.out.println(tree.root.rightChild.leftChild.data);
System.out.println(tree.root.leftChild.data);
Node node = tree.find(3);
System.out.println(node.data + ", " + node.sData);*/
//tree.frontOrder(tree.root);
//tree.inOrder(tree.root);//从小到大进行排序
tree.afterOrder(tree.root);
}
}
结果:
前序遍历:
中序遍历:
后序遍历:
与我们之前的结果一样