学院网站建设报价,网络推广公司口碑,网站备案是针对空间还是域名,软件开发培训机构多少钱想要精通算法和SQL的成长之路 - 验证二叉树的前序序列化 前言一. 验证二叉树的前序序列化 前言 想要精通算法和SQL的成长之路 - 系列导航 一. 验证二叉树的前序序列化
原题链接 思路#xff08;参考负雪明图#xff09;#xff1a;
首先我们看题目所给的字符串#xff… 想要精通算法和SQL的成长之路 - 验证二叉树的前序序列化 前言一. 验证二叉树的前序序列化 前言 想要精通算法和SQL的成长之路 - 系列导航 一. 验证二叉树的前序序列化
原题链接 思路参考负雪明图
首先我们看题目所给的字符串是一个先序遍历的结果。也就是说父节点– 左节点–右节点这么一个遍历顺序。那么我们可以先校验左子树是否是合法的再判断右子树是否合法。从而决定当前树是否有效。
如果一个节点是叶子节点它的两个孩子必定是空对于题目而言就是 否则一个非叶子节点存在两种可能
两个孩子都非空。一个孩子为空一个孩子非空。
如图 核心思路如下
如果遇到叶子节点两个孩子都为空的时候将当前叶子节点看做是一个空节点。那么对于该叶子节点的父节点而言两个孩子都变成了空节点那么父节点就是叶子节点。以此往上递推。即 4,#,# 变成#例如[9,#2,#,6,#,#] [9,#,2,#,#] [9,#,#] [#]。
我们用栈来遍历这个前序遍历的结果用自底向上的特性去操作
从左往右元素不断入栈。当栈顶的前三个元素满足以下条件前两个都是#第三个非#。此时弹出前三个元素再入一个#号作为替代。 4,#,# 变成#的一个体现。最终遍历完毕如果整个栈中还剩下一个元素并且是#号 说明二叉树的前序遍历是有效的。
public boolean isValidSerialization(String preorder) {LinkedListString stack new LinkedList();for (String str : preorder.split(,)) {stack.push(str);// 如果栈顶的前两个元素都是#号并且第三个元素非 # 号那么弹出前三个元素并入一个#号while (stack.size() 3 #.equals(stack.get(0)) #.equals(stack.get(1)) !#.equals(stack.get(2))) {stack.pop();stack.pop();stack.pop();stack.push(#);}}return stack.size() 1 #.equals(stack.get(0));
}