一、树的基本知识点
根节点:没有父节点的节点
子节点:子节点是相对父节点的概念,较上一级低一级的节点
叶子节点:没有子节点的节点
二、二叉树的分类
三、遍历树的方式
先序遍历:先根节点开始遍历,再遍历左节点,最后遍历右节点;
中序遍历:先左节点开始遍历,再遍历根节点,最后遍历右节点;
后序遍历:先左节点开始遍历,再遍历右节点,最后遍历根节点;
1、先创建树的节点,以便后续对节点及数据进行操作:
public class TreeNode {
Object value;
TreeNode leftNode;
TreeNode rightNode;
/**
*传入树中的数据信息和节点信息
* @param value
* @param leftNode
* @param rightNode
*/
public TreeNode(Object value, TreeNode leftNode, TreeNode rightNode) {
super();
this.value = value;
this.leftNode = leftNode;
this.rightNode = rightNode;
}
public Object getValue() {
return value;
}
public void setValue(Object value) {
this.value = value;
}
public TreeNode getLeftNode() {
return leftNode;
}
public void setLeftNode(TreeNode leftNode) {
this.leftNode = leftNode;
}
public TreeNode getRightNode() {
return rightNode;
}
public void setRightNode(TreeNode rightNode) {
this.rightNode = rightNode;
}
}
2、创建自己的树:
import java.util.LinkedList;
public class MyTree {
// 将数据存到数组里面去
public int[] value = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
// 将数据添加到链表中
public LinkedList<TreeNode> list = new LinkedList<TreeNode>();
public void creeatTree() {
// 将数组里面的数据存到节点里面,然后将节点封装到链表里面
for (int i = 0; i < value.length; i++) {
TreeNode node = new TreeNode(value[i], null, null);
list.add(node);
}
// 构建树的数据结构-----完全二叉树
for (int i = 0; i < list.size() / 2 - 1; i++) {
// 创建左节点
list.get(i).setLeftNode(list.get(i * 2 + 1));
// 创建右节点
list.get(i).setRightNode(list.get(i * 2 + 2));
}
int lastIndex = list.size() / 2 - 1;
// 获得最后一个父节点
TreeNode parentNode = list.get(lastIndex);
// 最后一个父节点的左节点
parentNode.setLeftNode(list.get(lastIndex * 2 + 1));
// 最后一个父节点的右节点
if (list.size() % 2 == 1) {
parentNode.setRightNode(list.get(lastIndex * 2 + 2));
}
}
/**
* 先序遍历
*
* @param root
*/
public void preOrder(TreeNode root) {
if (root == null) {
return;
}
// 先访问根节点
System.out.print(root.getValue()+",");
// 后访问左节点
preOrder(root.getLeftNode());
// 最后访问右节点
preOrder(root.getRightNode());
}
/**
* 中序遍历
* @param root
*/
public void centerOrder(TreeNode root) {
if (root == null) {
return;
}
// 先访问左节点
centerOrder(root.getLeftNode());
// 后访问根节点
System.out.print(root.getValue()+",");
// 最后访问右节点
centerOrder(root.getRightNode());
}
/**
* 后序遍历
* @param root
*/
public void endOrder(TreeNode root) {
if (root == null) {
return;
}
// 先访问左节点
endOrder(root.getLeftNode());
// 后访问右节点
endOrder(root.getRightNode());
// 最后访问根节点
System.out.print(root.getValue()+",");
}
}
3、测试类:public class Test {
public static void main(String[] args) {
MyTree tree = new MyTree();
tree.creeatTree();
tree.preOrder(tree.list.get(0));
System.out.println();
tree.centerOrder(tree.list.get(0));
System.out.println();
tree.endOrder(tree.list.get(0));
}
}