[leetcode-331]Verify Preorder Serialization of a Binary Tree
2016-04-05 18:40
330 查看
该题一共有三种解法,首先我们给出字符串分隔的函数,该函数在以下三个方法中均会用到:
vector<string> split(string input, char delimiter) {
vector<string> result;
while (true) {
int idx = input.find_first_of(delimiter);
if (idx == -1) {
result.push_back(input);
return result;
}
result.push_back(input.substr(0, idx));
input = input.substr(idx + 1);
}
}
vector<string> split(string input, char delimiter) {
vector<string> result;
while (true) {
int idx = input.find_first_of(delimiter);
if (idx == -1) {
result.push_back(input);
return result;
}
result.push_back(input.substr(0, idx));
input = input.substr(idx + 1);
}
}
方法一:
可以利用一层一层的删除叶子节点的方式完成。bool isValidSerialization(string preorder) { vector<string> nodes = split(preorder, ','); // 初始化一个栈 vector<bool> st(nodes.size(), false); int pos = 0; for (auto node: nodes) { if (st[0] && pos > 0) { return false; } // 当遇到‘#’时,将true压入到栈中 st[pos] = (node == "#"); // 如果当前位置为‘#’,上一个位置为‘#’,再上一个位置不为‘#’时,弹出栈中这三个元素 // 再向栈中压入‘#’。该过程表示将这两个叶节点和一个中间节点,替换为一个叶节点。 while (pos >= 2 && st[pos] && st[pos - 1] && !st[pos - 2]) { pos -= 2; st[pos] = true; } ++ pos; } // 当处理完整颗树后,只存在一个空的跟节点,即整棵树表示为‘#’ return st[0] && pos == 1; }
方法二:
通过计算节点的度进行计算。所有的非叶子节点(除根节点)出度(outdegree)为2,入度(indegree)为1。所有的叶子节点出度为0,入度为1。我们记diff = outdegree - indegree。所以,当我们遍历数组时,每当遇到一个节点 diff--,因为该节点提供了一个入度;如果该节点不是叶子节点,那么在diff--的基础上再让diff += 2,因为中间节点还提供了两个出度。如果整个序列是正确的,那么diff不会是负数,且当整个序列遍历结束时,diff == 0。bool isValidSerialization(string preorder) { vector<string> nodes=split(preorder, ','); int diff = 1; for(auto node : nodes) { diff--; if(diff < 0) return false; if(node != "#") diff += 2; } return diff == 0; }
方法三:
叶节点数 = 中间节点数 + 1bool isValidSerialization(string preorder) { /*** for a binary tree : count_null=count_node+1 **/ int count_null=0, count_node=0; vector<string> nodes=split(preorder, ','); int i = 0; for (i = 0; i < nodes.size() && count_null != count_node + 1; i++) { if(nodes[i] == "#") count_null++; else count_node++; } return i == nodes.size() && (count_null == count_node + 1); }
相关文章推荐
- 一个关于if else容易迷惑的问题
- 一道sql面试题附答案
- C# 超高面试题收集整理
- 人人网javascript面试题 可以提前实现下
- PHP中设置一个严格30分钟过期Session面试题的4种答案
- 据说是雅虎的一份PHP面试题附答案
- php牛逼的面试题分享
- 一套比较完整的javascript面试题(部分答案)
- 10个经典的Java main方法面试题
- 小米公司JavaScript面试题
- 超级全面的PHP面试题整理集合第1/2页
- 极易被忽视的javascript面试题七问七答
- 5个实用的shell脚本面试题和答案
- PHP经典面试题集锦
- 8个PHP数组面试题
- PHP中提问频率最高的11个面试题和答案
- 用PHP解决的一个栈的面试题
- Android工程师面试题大全
- PHP面试题之文件目录操作
- 几道坑人的PHP面试题 试试看看你会不会也中招