您的位置:首页 > Web前端

《剑指offer》——树的子结构

2015-11-01 21:21 369 查看
T:

题目描述

输入两颗二叉树A,B,判断B是不是A的子结构。

这地方需要注意的有两点:

判断的是“子结构”,而非“子树”,我第一次提交,就当成子树去做的,结果error;

如果两个子树中有一个是null,那么就返回false,这个规定题目中没有给出说明,《剑指offer》中的很多题目都有类似的缺陷。

这种题目,递归是最好的方式,我的思路:

略微麻烦了些,因为是将B和A比较,判断B是否是A的子结构,那就以A为出发点,将A的所有节点都放在一个队列里面,然后根据先进先出的思想,用广度优先遍历(BFS)的方式,一次从queue中弹出一个节点,判断该节点和B的头结点是否val相同,如果相同,那么以此两个节点作为一个递归函数的参数,判断其各自代表的子树是否相同。

构想此思路之前,就误解了题意,还是“子结构”和子树的问题,其实两者的解决思路相同,只不过递归终止的条件略有区别罢了。

代码的注释中,有对递归的详细解释。

上代码:

package niuke.sward2offer.substructureOfTree;

import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

/**
* T:树的子结构
*
* 题目描述
* 输入两颗二叉树A,B,判断B是不是A的子结构。
*
* date: 2015.11.1
*
* @author SSS
*
*/
class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;

public TreeNode(int val) {
this.val = val;

}

}

public class Solution {

public boolean HasSubtree(TreeNode root1, TreeNode root2) {
boolean flag = false;
Queue<TreeNode> queue = new LinkedList<TreeNode>();
if (root1 == null || root2 == null) {
return false;
}
queue.offer(root1);
while (queue.size() != 0) {
TreeNode tempNode = queue.poll();
if (tempNode.val == root2.val) {
flag = this.isEqual(tempNode, root2);
}

if (flag) {
break;
}

// 广度遍历的方式,遍历第一个树A的所有节点
if (tempNode.left != null) {
queue.offer(tempNode.left);
}
if (tempNode.right != null) {
queue.offer(tempNode.right);
}
}

return flag;
}

/**
* 判断两个子树是否相同
*
* 思想:判断其两个子节点的值是否相同,如果相同,就返回true
*
* isEqual(param1, param2):两个参数,其值是否相同,相同就看其各自的两个孩子节点是否相同,不相同就直接返回false
* 终止条件:如果都为null,说明都遍历完毕,返回true
*
* @param firstNode
* @param secondNode
* @return
*/
public boolean isEqual(TreeNode firstNode, TreeNode secondNode) {

// 判断的是“子结构”
if (secondNode == null) {
return true;
}

/*
// 判断的是“子树”
if (firstNode == null && secondNode == null) {
return true;
}
*/

boolean flag = false;

// 只有当前两个参数都不为null,且其值相同时,才能进一步的作比较,否则直接返回false
if (firstNode != null && secondNode != null && firstNode.val == secondNode.val) {
flag = isEqual(firstNode.left, secondNode.left) && isEqual(firstNode.right, secondNode.right);
}

return flag;
}

public static void main(String[] args) {

TreeNode root1 = new TreeNode(2);
TreeNode left1 = new TreeNode(1);
TreeNode right2 = new TreeNode(3);
root1.left = left1;
root1.right = right2;

TreeNode left11 = new TreeNode(4);
TreeNode right12 = new TreeNode(5);
left1.left = left11;
left1.right = right12;

TreeNode right22 = new TreeNode(6);
right2.right = right22;

TreeNode root2 = new TreeNode(2);
TreeNode lefta = new TreeNode(4);
TreeNode righta = new TreeNode(3);
//    root2.left = lefta;
root2.right = righta;

Solution solution = new Solution();
System.out.println(solution.HasSubtree(root1, root2));
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: