华为上机真题 2022完全二叉树非叶子节点后序遍历

Posted Linux猿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了华为上机真题 2022完全二叉树非叶子节点后序遍历相关的知识,希望对你有一定的参考价值。

🎈 作者:Linux猿

🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊!

🎈 关注专栏: 数据结构和算法成神路【精讲】优质好文持续更新中……🚀🚀🚀

🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬


目录

一、题目描述

1.1 输入描述

1.2 输出描述

1.3 测试样例

1.3.1 示例 1

二、解题思路

三、代码实现

四、时间复杂度


一、题目描述

给定一个以顺序存储结构(按每一层从左到右顺序)存储整数值的完全二叉树序列(最多 1000 个整数),请找出此完全二叉树的所有非叶子节点部分,然后采用后序遍历的方式将该树的非叶子节点输出。

只有一个节点的树,此节点是根节点,应该被认为是非叶子节点。

此完全二叉树并非满二叉树,可能存在倒数第二层出现叶子节点,或者无右叶子的情况。

后序遍历的顺序:左-右-根。

1.1 输入描述

一个通过空格分隔的整数序列字符串。

1.2 输出描述

非叶子部分树结构的后序遍历结果。

1.3 测试样例

1.3.1 示例 1

输入

1 2 3 4 5 6 7

输出

2 3 1

说明:找到非叶子部分树结构,然后采用后序遍历输出。

备注:输出数字以空格分隔。

二、解题思路

本题主要考查后序遍历,首先需要对输入的字符串进行解析,因为题目要求仅仅输出非叶子节点的后序遍历结果,所以只需要对非叶子节点进行后序遍历即可。

假设有完全二叉树有 n 个节点,那么,非叶子节点个数为 m = n / 2。

三、代码实现

代码实现如下所示。

#include <iostream>
#include <string>
#include <vector>
#include <sstream>
using namespace std;
vector<string>g;

// 后续遍历
void postOrder(int x, int n, bool &flag) 
    if (x * 2  + 1 < n) 
        postOrder(x * 2 + 1, n, flag);
    
    if (x * 2 + 2 < n) 
        postOrder(x * 2 + 2, n, flag);
    
    if (flag) cout<<" ";
    cout<<g[x];
    flag = true;


int main()

    string str;
    while (getline(cin, str)) 

        // 解析输入
        stringstream stream(str);
        while (getline(stream, str, ' ')) 
            g.push_back(str);
        

        int n = g.size()/2;
        bool flag = false;
        postOrder(0, n, flag);
        cout<<endl;

    
    return 0;

四、时间复杂度

时间复杂度:O(n)

其中,n 表示完全二叉树节点个数,在上述代码中,首先通过 while 解析出 n  个节点,然后通过后序遍历输出非叶子节点,所以时间复杂度为 O(n)。


🎈 感觉有帮助记得「一键三连支持下哦!有问题可在评论区留言💬,感谢大家的一路支持!🤞猿哥将持续输出「优质文章回馈大家!🤞🌹🌹🌹🌹🌹🌹🤞


以上是关于华为上机真题 2022完全二叉树非叶子节点后序遍历的主要内容,如果未能解决你的问题,请参考以下文章

华为机试真题 Java 实现完全二叉树非叶子部分后序遍历

递归遍历二叉树

二叉树非递归后缀遍历

华为OD机试真题 Python 实现二叉树的广度优先遍历

创建二叉树非递归完成对二叉树的先序和后序遍历并遍历输出每一层的结点数查找结点P 和结点Q的最近共同祖先

华为OD机试真题Python实现 最小叶子节点真题+解题思路+代码(2022&2023)