百度 2016 暑期实习在线笔试解题报告
题目:给定两个二叉树、判断其中一颗二叉树是否为另一颗二叉树的子树(假定树中的元素都是唯一的)
例如:二叉树
A: 6 和 B: 4
5 4 1 0
3 2 1 0
B 为 A 的子树
A: 6 和 B: 6
5 4 5 4
3 2 1 0
对于二叉树问题,最直观的解法 莫过于 分治递归了,
对于此问题 首先要找到 B 的根节点 在 A 中的匹配元素,然后 左右 节点递归的去匹配 (写递归程序时 大体逻辑不难,难点在与递归出口条件的判断,很容易疏忽一些细节)
看程序最能理解其中的逻辑与细节
public boolean isSub(Node root1, Node root2) {
if (root2 == null) { // 空树肯定是 非空树的子树
return true;
}
return ismatch(root1, root2);
}
// 判断 根节点为root2的树是否为 根为root1树 的子树
private boolean ismatch (Node root1, Node root2) {
if (root1 == null) {
return false;
}
if (root1.val == root2.val) { // 找到 与 B 的根节点匹配的节点
if (match(root1, root2)) { // 然后 判断 这两个树是否匹配
return true;
}
}
return ismatch(root1.left, root2) || ismatch(root1.right, root2); //递归的在 A 中找到与 B 的根节点匹配的节点
}
// 判断两颗树 是否匹配
private boolean match(Node root1, Node root2) {
if (root1 == null && root2 == null) { // 注意递归出口,只有匹配到叶节点 才算完全匹配 true
return true;
}
if (root1 == null || root2 == null) { // 注意递归出口,只有匹配到叶节点 才算完全匹配 否则 false
return false;
}
if (root1.val != root2.val) { // 节点元素不相等 , false
return false;
}
return match(root1.left, root2.left) && match(root1.right, root2.right); // 分别比较左右节点
}