1.初始化数组
将 getNumNodes() 方法返回的节点数量赋值给 tempLength 变量
//Initialize arrays.
int tempLength = getNumNodes();
创建一个长度为tempLength的字符数组,并将这个数组赋值给valuesArray变量。
创建一个长度为tempLength的整数数组,并将这个数组赋值给indicesArray变量。
声明一个整数变量i,并将其初始值设置为0。
valuesArray = new char[tempLength];
indicesArray = new int[tempLength];
int i = 0;
分别创建和初始化CircleObjectQueue队列、CircleIntQueue队列
//Traverse and convert at the same time.
CircleObjectQueue tempQueue = new CircleObjectQueue();
tempQueue.enqueue(this);
CircleIntQueue tempIntQueue = new CircleIntQueue();
tempIntQueue.enqueue(0);
2.遍历二叉树并储存遍历结果
出队操作:
从tempQueue队列中出队一个节点的。出队的节点被强制转换为BinaryCharTree类型,并赋值给tempTree变量。
从tempIntQueue队列中出队一个整数的。出队的整数被赋值给tempIndex变量。
BinaryCharTree tempTree = (BinaryCharTree) tempQueue.dequeue();
int tempIndex = tempIntQueue.dequeue();
while循环遍历二叉树,将当前节点的值和索引分别存储到valuesArray和indicesArray中,并将计数器i加1。
while (tempTree != null) {
valuesArray[i] = tempTree.value;
indicesArray[i] = tempIndex;
i++;
入队左子树和右子树
tempQueue.enqueue(tempTree.leftChild):将左子树入队。
tempIntQueue.enqueue(tempIndex * 2 + 1):将左子树的索引入队。左子树的索引是当前索引的2倍加1。
同理
tempQueue.enqueue(tempTree.rightChild):将右子树入队。
tempIntQueue.enqueue(tempIndex * 2 + 2):这是将右子树的索入队的操作。右子树的索引是当前索引的2倍加2。
if (tempTree.leftChild != null) {
tempQueue.enqueue(tempTree.leftChild);
tempIntQueue.enqueue(tempIndex * 2 + 1);
} // Of if
if (tempTree.rightChild != null) {
tempQueue.enqueue(tempTree.rightChild);
tempIntQueue.enqueue(tempIndex * 2 + 2);
} // Of if
继续遍历
这两行代码是循环的结束部分,它们再次从队列中出队一个节点和一个索引,为什么要这样做?
以便在下一次循环中继续遍历。这样可以确保在下一次迭代中有一个新的节点和索引可以处理。如果不在循环末尾出队,循环将无法继续,因为tempTree和tempIndex将不会更新。
tempTree = (BinaryCharTree) tempQueue.dequeue();
tempIndex = tempIntQueue.dequeue();
3.main函数
二叉树的构建、遍历、深度计算、节点数计算以及将二叉树的数据转换为数组。
构建
public static void main(String args[]) {
BinaryCharTree tempTree = manualConstructTree();
前序遍历、中序遍历、后序遍历
System.out.println("\r\nPreorder visit:");
tempTree.preOrderVisit();
System.out.println("\r\nIn-order visit:");
tempTree.inOrderVisit();
System.out.println("\r\nPost-order visit:");
tempTree.postOrderVisit();
深度计算
System.out.println("\r\n\r\nThe depth is: " + tempTree.getDepth());
节点数计算
System.out.println("The number of nodes is: " + tempTree.getNumNodes());
将二叉树的数据转换为数组
tempTree.toDataArrays();
System.out.println("The values are: " + Arrays.toString(tempTree.valuesArray));
System.out.println("The indices are: " + Arrays.toString(tempTree.indicesArray));
}// Of main
4.运行结果
Preorder visit:
a b d f g c e
In-order visit:
b f d g a e c
Post-order visit:
f g d b e c a
The depth is: 4
The number of nodes is: 7
No element in the queue
The values are: [a, b, c, d, e, f, g]
The indices are: [0, 1, 2, 4, 5, 9, 10]