-
二叉树的定义与具体介绍可以参考:https://blog.csdn.net/qingtian_1993/article/details/80877487
-
创建二叉树的基本思想;
- 创建一个类,这个类中有根、数值、左孩子、右孩子;
- 数据可以通过数组赋值给树结构中的值,所以可以加一个链表级别的数据域,存放每个节点的数据;
- 给节点填值;
-
代码
public class TreeFirst {
private Object value; //单个数据
private TreeFirst leftChild; //做孩子
private TreeFirst rightChild; //右孩子
public TreeFirst root;
public List<TreeFirst> datas;
public TreeFirst(TreeFirst leftChild, TreeFirst rightChild, Object value) {
this.leftChild = leftChild;
this.rightChild = rightChild;
this.value = value;
}
public TreeFirst() {
}
public TreeFirst(Object value) {
this.value = value;
}
//创建一棵树
public void createBinTree(Object[] objs) {
datas = new ArrayList<TreeFirst>();
for (Object object : objs) {
datas.add(new TreeFirst(object)); //将一个数组装入一个列表中;
}
//将第一个数值赋给根
root = datas.get(0);
for(int i = 0; i < datas.size()/2; i++) {
datas.get(i).leftChild = datas.get(2*i+1);
System.out.print(datas.get(i).leftChild.value + " ");
if(2*i+2 < datas.size()) { //因为列表中的第一个元素给了根,所以需要考虑
datas.get(i).rightChild = datas.get(2*i+2);
System.out.print(datas.get(i).rightChild.value + " ");
}
}
}
public static void main(String[] args) {
Object[] objs = {1,2,3,4,5,6,7,8,9,10,11};
TreeFirst first = new TreeFirst();
first.createBinTree(objs);
}
结果:
2 3 4 5 6 7 8 9 10 11
datas.get(i).rightChild = datas.get(2*i+2); 这行代码看起来挺难理解的,刚才我也在想这个是怎么回事,后来我想了一个接近于正确说法的答案:datas.get(i)是给每一个根节点赋值,例如,1作为根节点,2与3都是1的左右孩子,抛去1根节点,从1的左孩子节点与右孩子节点分别是datas的第0和1个节点,这也是递归。上述顺序是按照层级铺展的顺序给每个节点填值的。这就算创建了一个节点值了,明天有时间写三种遍历方法~
好好学习,不要让任何人打乱你的节奏~