题目
思路
由于树给出的方式是按照完全二叉树的方式给出的,对于不越界的情况下,结点i的左孩子是2* i,右孩子是2*i+1。所以完全可以用一个数组存入,然后再做文章。
对于一个给定结点数的二叉树的高度是
(int)(log2(n))+1
这是由于对于层数为k的二叉树的结点数n一定满组:
2k-1≤n<2k,为了计算k我们选取等于号即可。
AC代码
#include <bits/stdc++.h>
using namespace std;
//是按照完全二叉树的形状给读进来的,每个结点都有l和r
/*
1.用数组读入二叉树
i号结点的左孩子一定是2i 右孩子一定是2i+1
*/
const int N = 110;
int a[N];
int n;
void lastOrder(int x) {
if (a[2 * x] != 0 && 2 * x <= n)
lastOrder(2 * x);
if (a[2 * x + 1] != 0 && 2 * x + 1 <= n)
lastOrder(2 * x + 1);
cout << a[x] << " ";
}
int main() {
cin >> n;
for (int i = 1; i <= n; ++i) {
cin >> a[i];
}
//log2(n)+1
cout << int(log2(n)) + 1 << endl;
lastOrder(1);//从下标为1的点开始dfs
}