发布于个人公众号,打开微信,搜索
MelodyJerry
即可
前序
字节秋招一面(提前批,商业化技术,base深圳)和美团秋招(base上海),
都出现了差不多的算法题:根据数组形式的二叉树的前序序列和中序序列,假设树种没有重复元素,现要求还原该二叉树,并返回该二叉树的层次序列、后序序列
。
当时手撕算法,是以
牛客ACM模式
,要求自己建立数据结构,传入数组,实现算法。
但只是懂的根据
前序序列和中序序列
来还原二叉树
还是不够的,其他的组合情况也要掌握,在后文一并解决这个。
还原二叉树
✔4种遍历方式
先来确定二叉树
的4种遍历
方式:
层次序列
/层次遍历
:
-
访问根节点
-
从上到下、从左到右,一次遍历每个节点
前序序列
/前序遍历
:
-
访问根节点
-
前序遍历左子树
-
前序遍历右子树
中序序列
/中序遍历
:
-
中序遍历左子树
-
访问根节点
-
中序遍历右子树
后序序列
/后序遍历
:
-
后序遍历左子树
-
后序遍历右子树
-
访问根节点
数据结构
✔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