华为OD统一考试B卷|100分|Java 完全二叉树非叶子部分后序遍历

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

1、只有一个节点的树,此节点认定为根节点(非叶 子)。

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

在这里插入图片描述

其他说明:二叉树的后序遍历是基于根来说的,遍历顺序为:左-右-根

输入描述

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

输出描述

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

示例1

输入输出示例仅供调试,后台判题数据一般不包含示例输入

1234567

输出

231

说明

找到非叶子部分树结构,然后采用后续遍历输出

备注

输出数字以空格分隔


题解
这个问题可以通过递归的方式来解决。首先,我们需要将输入的序列解析成完全二叉树的结构,然后找出所有的非叶子节点,最后采用后序遍历方式输出非叶子部分树结构。

import java.util.ArrayList;
import java.util.List;

class TreeNode {
    int value;
    TreeNode left;
    TreeNode right;

    TreeNode(int value) {
        this.value = value;
        this.left = null;
        this.right = null;
    }
}

public class Main {
    public static void main(String[] args) {
        String inputStr = "1234567";
        TreeNode root = buildCompleteBinaryTree(inputStr);
        List<Integer> result = postOrderTraversal(root);

        // 输出结果,以空格分隔
        for (int i = 0; i < result.size(); i++) {
            if (i < result.size() - 1) {
                System.out.print(result.get(i) + " ");
            } else {
                System.out.println(result.get(i));
            }
        }
    }

    public static TreeNode buildCompleteBinaryTree(String inputStr) {
        String[] values = inputStr.split(" ");
        return buildTree(values, 0);
    }

    private static TreeNode buildTree(String[] values, int index) {
        if (index >= values.length) {
            return null;
        }

        TreeNode node = new TreeNode(Integer.parseInt(values[index]));
        node.left = buildTree(values, 2 * index + 1);
        node.right = buildTree(values, 2 * index + 2);

        return node;
    }

    public static List<Integer> postOrderTraversal(TreeNode root) {
        List<Integer> result = new ArrayList<>();
        postOrder(root, result);
        return result;
    }

    private static void postOrder(TreeNode node, List<Integer> result) {
        if (node == null) {
            return;
        }

        postOrder(node.left, result);
        postOrder(node.right, result);

        // 判断是否为非叶子节点,然后添加到结果列表中
        if (node.left != null || node.right != null) {
            result.add(node.value);
        }
    }
}

使用这段代码,你可以将输入的序列解析成二叉树,并输出非叶子部分树结构的后序遍历结果。输入的数字以空格分隔,输出也以空格分隔。这个代码片段首先构建了二叉树,然后进行后序遍历,仅输出非叶子节点的值。

考点解析

这个问题涉及到了以下几个算法和数据结构的考点:

  1. 二叉树的表示:如何将给定的顺序储存结构的整数序列解析成二叉树的表示。这里使用了数组表示法,其中数组的索引关系用于确定节点之间的父子关系。

  2. 二叉树的遍历:问题要求使用后序遍历方式输出非叶子部分树结构。后序遍历是一种深度优先遍历方法,首先遍历左子树,然后右子树,最后是根节点。这种遍历方式特别适合在处理树结构时筛选非叶子节点。

  3. 递归:解决这个问题的关键在于递归构建二叉树和递归进行后序遍历。递归是一种重要的编程技巧,特别适用于树结构的处理。

  4. 字符串处理:输入序列的解析涉及到字符串的处理,包括将字符串拆分成数组以及将字符串表示的数字转换为整数。

总体来说,这个问题考察了树结构的表示和遍历,递归算法,以及字符串处理等编程技巧。对于面试者来说,理解这些概念和技巧,能够用代码实现解决这种问题是非常有帮助的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

拎把镐头打狼去

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值