思路:

根据满二叉树的性质,可以得到一个结论:对于任意一个节点,其左子树和右子树的节点数相等或相差1。

因此,可以根据先序遍历的结果,找到根节点,然后根据根节点将序列分为左子树和右子树的序列,再递归处理左子树和右子树即可。

代码实现:

#include <stdio.h>

// 求满二叉树中序遍历
void inorder(int left, int right, int depth) {
    if (left > right) return; // 递归终止条件

    int mid = (left + right) / 2; // 中间节点
    inorder(left, mid - 1, depth + 1); // 递归处理左子树
    printf("%d ", depth); // 输出当前节点的深度
    inorder(mid + 1, right, depth + 1); // 递归处理右子树
}

int main() {
    int n;
    scanf("%d", &n);

    inorder(1, n, 1); // 从根节点开始递归处理

    return 0;
}

时间复杂度:$O(n)$,其中 $n$ 为满二叉树的节点数。因为每个节点只会被访问一次。

给定一棵满二叉树先序遍历的结果求该树中序遍历的输出结果C代码怎么写时间消耗最少

原文地址: https://www.cveoy.top/t/topic/b19T 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录