1. 给出一组数的 中序遍历 和 先序遍历 求->后序遍历
例如
void solve (int preL, int inL, int postL, int n){ // 先序遍历 中序遍历 后序遍历 总数
if(n == 0) return 0;
if(n == 1) post[postL] = pre[preL];
root = pre[preL]; // 先序遍历第一个为根结点
post[postL+n-1] = root; // 后序遍历最后一个为根结点
for(i = 0; i < n; i++){ // 在中序遍历中寻找根结点
if(in[inL] == root) break;
}
L = i; R = n-L-1;
solve(preL+L, inL, postL, L);
solve(preL+L+1, inL+L+1, postL+L, R);
}
树的表示法: 链表 和 数组
非完全二叉树的情况下一般使用链表 因为 当树非常不平衡时数组会浪费空间
2. 输入一组数 给出它的完全二叉树
排序后的数组
结果树 T
void solve(int ALeft, int ARight, int TRoot)
{// 初始值 0 , N-1, 0
n = ARight - ALeft + 1; // 计算总数
if(n == 0) return;
L = GetLeftLenght(n); // 计算n个结点及其左子树有多少个结点
T[TRoot] = A[ALeft + L]; // 结果树中的结点 TRoot为下标
LeftTRoot = TRoot * 2 +1; // 左子树的结点 左孩子为 上一个结点 *2 +1 而堆中第 0 个不存值为“哨兵”左孩子为 *2
RightTRoot = LeftTRoot +1;//右子树结点
solve(ALeft, ALeft+L-1, LeftTRoot);// 左子树
solve(ALeft+L+1, ARight, RightTRoot);
}
计算左子树的规模