LeetCode每日一题,1028.Recover a Tree From Preorder Traversal
先看题目描述
题目大意就是给定一个字符串,表示二叉树的先序遍历和每个节点深度,让我们将二叉树还原
算法和思路
我们记当前节点为 T,上一节点为 S,那么实际上只有两种情况:
- T 为 S 的左子节点
- T 是根节点到 S 的这一条路径上(不包括 S)某一个节点的右子节点
于是我们可以用栈来保存节点,在遍历时要记录当前节点 T 的值和深度,若 T 深度比 S 刚好大 1,则 T 为 S 的左子节点,否则 T 是根节点到 S 的这一条路径上(不包括 S)某一个节点的右子节点,于是我们可以不停的将节点出栈,直到 T 的深度恰好比栈顶节点的深度大 1,此时 T 为栈顶节点的右子节点
算法流程
建立一个栈 stack 来记录节点
遍历字符串,遍历时不断维护节点的深度 dep
- 遍历到当前节点 T 时,若 dep 与栈深度相等且栈不为空,则 T 为栈顶节点的左子节点
- 若 dep 与栈的深度不相等,则不断将栈顶节点出栈直至 dep 与栈的深度相等,此时 T 为栈顶节点的右子节点
- 将 T 入栈
将栈顶节点不断出栈直至栈的深度为 1
返回栈顶节点(二叉树的根节点)
算法源码
1 | import java.util.Deque; |