/**二叉树的存储存储到数组当中,会有先序中序和后序遍历
例如一棵存储的二叉树数组元素 78,56,34,43,4,1,15,2,23
先序遍历结果是 先根左右 78 56 43 2 23 34 1 15
中序遍历结果是2 43 23 56 4 78 1 34
后序遍历结果是 2 23 43 4 56 1 15 34 78
/**
伪代码如下: 利用的是递归调用的形式
preOrder(arr , index):
if (i >= arr.length)//终止条件当超过数组长度了就返回
return;
print(arr[i])
preOrder(arr, 2*i+1)//输出左子树
preOrder(arr, 2*i+2)//输出右子树
midOrder(arr, index):
if (i>=arr.length)
return;
midOrder(arr, 2*i+1)//先输出左子树
print(arr[i])
midOrder(arr,2*i+2)//输出右子树
/**
堆的概念:二叉堆是完全二叉树或者近似完全二叉树
二叉堆满足1,父结点的键值总是大于或等于(小于或等于)
任何一个子节点的键值
每个结点的左子树和右子树都是一个二叉堆(都是最大堆和
最小堆)
任意节点值都大于其子节点值---大顶堆
任意节点值都小于其子节点值---小顶堆
关于小顶堆排序的伪代码实现思路
从一个二叉树的存储的n/2-1处出发进行节点的调整
如果节点值小于左右节点,则与最小的交换,
然后再进行向下调整这叫做堆化,如果堆化完成后
顺序输出就行
伪代码实现如下:
minHeapSort(arr)
n= (arr.length)/2-1
for (int i =n;i<=0;i--)
minHeapFixDown(arr, i)
minHeapFixDown(arr, i):
left = 2*i+1;//用left表示左节点更容易理解,比j,k实用
right = 2*i +2 //用right表示右节点更容易理解
//先确定最小的节点值 //比单纯的三个值比较更有效( if (arr[j]>arr[k] && arr[i]>arr[k]) )
min = 0;
//边界条件判断
if (left>=n)
return;
//min指向左右孩子中较小的那个
min = left
if (right>=n)
min = left
else {
if (arr[right]<arr[left]){
min = right;
}
//如果arr[i]比两个孩子都小,不用调整
if(arr[i]<=arr[min])
return;
//否则,找到两个孩子中较小的,和i交换
temp = arr[i],
arr[i] = arr[min]
a[min]= temp;
minHeapFixDown(arr, min)
}