Bootstrap

DAY22 二叉树的存储

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]

;