[面试|算法] 三种不同组合情况,还原二叉树

本文探讨了如何根据不同的遍历序列(前序、中序、后序、层序)组合来重建二叉树。详细介绍了使用前序+中序、中序+后序、层序+中序序列重建二叉树的算法思路,并指出其他遍历组合无法唯一确定二叉树结构。同时提供了相关参考资料和完整代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

发布于个人公众号,打开微信,搜索MelodyJerry即可

前序

字节秋招一面(提前批,商业化技术,base深圳)和美团秋招(base上海),

都出现了差不多的算法题:根据数组形式的二叉树的前序序列和中序序列,假设树种没有重复元素,现要求还原该二叉树,并返回该二叉树的层次序列、后序序列

当时手撕算法,是以牛客ACM模式,要求自己建立数据结构,传入数组,实现算法。

图片

但只是懂的根据前序序列和中序序列还原二叉树还是不够的,其他的组合情况也要掌握,在后文一并解决这个。

还原二叉树

✔4种遍历方式

先来确定二叉树4种遍历方式:

  • 层次序列/层次遍历
  1. 访问根节点

  2. 从上到下、从左到右,一次遍历每个节点

  • 前序序列/前序遍历
  1. 访问根节点

  2. 前序遍历左子树

  3. 前序遍历右子树

  • 中序序列/中序遍历
  1. 中序遍历左子树

  2. 访问根节点

  3. 中序遍历右子树

  • 后序序列/后序遍历
  1. 后序遍历左子树

  2. 后序遍历右子树

  3. 访问根节点

数据结构

✔class TreeNode

import java.util.LinkedList;
import java.util.Queue;

public class TreeNode {
   
   
    int value;
    TreeNode leftChild;
    TreeNode rightChild;
    
    TreeNode() {
   
   }
    TreeNode(int value) {
   
    this.value = value; }
    TreeNode(int value, TreeNode leftChild, TreeNode rightChild) {
   
   
        this.value = value;
        this.leftChild = leftChild;
        this.leftChild = rightChild;
    }

    /**
     * 层序遍历
     */
    public String readLevel() {
   
   
        Queue<TreeNode> queue = new LinkedList<>();
        StringBuilder result = new StringBuilder();
        queue.offer(this);
        while (!queue.isEmpty()) {
   
   
            TreeNode curNode = queue.poll();
            result.append(curNode.value + " ");
            if (curNode.leftChild != null) {
   
   
                queue.offer(curNode.leftChild);
            }
            if (curNode.rightChild != null) {
   
   
                queue.offer(curNode.rightChild);
            }
        }
        return result.toString();
    }

    /**
     * 前序遍历
     */
    public String readPre() {
   
   
        StringBuilder result = new StringBuilder();
        result.append(value + " "); //前序遍历
        if (leftChild != null) {
   
   
            result.append(leftChild.readPre());
        }
        if (rightChild != null) {
   
   
            result.append(rightChild.readPre());
        }
        return result.toString();
    }

    /**
     * 中序遍历
     */
    public String readMid() {
   
   
        StringBuilder result = new StringBuilder();
        if (leftChild != null) {
   
   
            result.append(leftChild.readMid());
        }
        result.append(value + " "); //中序遍历
        if (rightChild != null) {
   
   
            result.append(rightChild.readMid());
        }
        return result.toString();
    }

    /**
     * 后序遍历
     */
    public String readEnd() {
   
   
        StringBuilder result = new StringBuilder();
        if (leftChild != null) {
   
   
            result.append(leftChild.readEnd());
        }
        if (rightChild != null) {
   
   
            result.append(rightChild.readEnd());
        }
        result.append(value + " "); //后序遍历
        return result.toString();
    }

    @Override
    public boolean equals(Object parm) {
   
   
        if (parm == null || !(parm instanceof TreeNode)) {
   
   
            return false;
        }

        TreeNode obj = (TreeNode) parm;
        if (this.value == obj.value
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

喜欢前端的后端MelodyJerry

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

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

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

打赏作者

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

抵扣说明:

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

余额充值