您的位置:首页 > 其它

二叉树 判断是否为子树解题报告 (百度2016暑期实习笔试)

2016-04-22 11:14 866 查看
百度 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);  // 分别比较左右节点
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: