数组顺序储存二叉树
根据数组顺序,将数组元素储存进一个完全二叉树。 至于为什么是完全二叉树,因为完全二叉树转化成有序数组后才最有效的利用数组空间,不至于浪费。 提示:记录,复习,学习
一、具体步骤
1.思路分析
一个有序数组,对应的完全二叉树: 一个二叉树的节点(下标index),对应的父节点下标:(index-1)/2,对应的值index+1 同样,该节点(下标index)的左子节点下标:2index+1 右子节点的下标2index+2 先根据数组从index=0开始,根据子节点的规律,在数组中得到相应的子节点下标,然后根据下标的值得到节点的值,通过getparent(val)得到父节点,然后将待添加节点添加到父节点左右,先左后右。 引用于尚硅谷截图(哈哈哈)
数组方法
代码如下(示例):
public void SequentialStorage(int[] arr, int index) {
if (arr == null || arr.length == 0) {
System.out.println("数组为空");
return;
}
head.addOrder(new Node(arr[index], (index + 1) + ""), arr[index]);
if (index * 2 + 1 < arr.length)
SequentialStorage(arr, index * 2 + 1);
if (index * 2 + 2 < arr.length)
SequentialStorage(arr, index * 2 + 2);
}
2.加入二叉树的方法
代码如下(示例):
public void addOrder(Node node, int index) {
Node parent = getParent(index);
if (parent == null) {
System.out.println("无父节点");
return;
} else
System.out.println(index + "的父节点是:" + parent);
if (parent.left == null) {
parent.setLeft(node);
return;
} else {
if (parent.right == null) {
parent.setRight(node);
return;
}
}
}
该处使用先左后右顺序添加
得到父节点方法
public Node getParent(int val) {
if (val - 1 == 0)
return null;
return find((val - 1 - 1) / 2 + 1);
}
find(Node node)
public Node find(int val) {
Node temp = null;
if (this.left != null)
temp = this.left.find(val);
if (temp != null)
return temp;
if (val == this.val)
return this;
if (this.right != null)
temp = this.right.find(val);
return temp;
}
前中序列遍历均可
总结
学习过程中的思路和一点点想法,后续还待优化改进啊,感谢韩老师的视频引导。
|