线索化二叉树
先看看顺序存储二叉树
顺序存储二叉树
说明:从数据存储来看,数组存储方式和树存储方式相同,树也可以转化为数组
现在我们需要将二叉树以数组方式存储,(基于完全二叉树的特点)
理解顺序存储二叉树的特点!!!!!
例如:第二个(从0开始)节点元素的左子节点对应其在数组的下标为5,对应图中的第5未,值为6
按照其下标进行创建和遍历
利用的是完全二叉树的性质
package x;
public class ArraBinaryTree {
public static void main(String[] args) {
int[] arr={1,2,3,4,5,6,7};
BinaryTree binaryTree = new BinaryTree(arr);
binaryTree.preOrder();//利用重载,自动传入根节点
}
}
class BinaryTree{
private int[]arr;//存储数据节点的数组
public BinaryTree(int []arr){
this.arr=arr;
}
public void preOrder(){
preOrder(0);
}
//先序遍历,index表下标
public void preOrder(int index){
if (arr==null||arr.length==0){
System.out.println("数组为空");
}
System.out.print(arr[index]);
//向左
if (2*index+1<arr.length){
preOrder(2*index+1);
}
//向右
if (2*index+2<arr.length){
preOrder(2*index+2);
}
}
}
顺序存储二叉树是学习堆排序的基础!!!
什么是线索化二叉树
线索化二叉树
说明:在我们遍历二叉树时最后一层节点的左右指针没有指向的节点,我们现在希望能充分利用每个节点的左右指针
使其能够指向该节点的前驱和后继节点。
(注意节点的左右指针可能指向左子树或前驱后继节点)
核心方法
//线索化左子树
treadNode(node.getLeft());
//线索化当前节点
if (node.getLeft() == null) {
//将当前节点的左指针指向前驱节点
node.setLeft(prenode);
node.setleftType(1);
}
//线索化右子树
if (prenode.getRight() == null && prenode != null) {
prenode.setRight(node);
prenode.setrightType(1);
}
//!!!!!每处理完一个节点后,让当前节点是下一个节点的前驱节点
prenode = node;
树结构实际应用堆排序
堆排序基于顺序化二叉树进行调整