剑指offer之编程(十三)
2016-05-27 22:41
459 查看
题目描述:
输入两颗二叉树A,B,判断B是不是A的子结构。
思路:题目已经指出是二叉树,B是A的子结构即B是否为A的一部分。大概分为两步:1.首先通过B的根节点,遍历A树找此节点在A中的位置。2.找到相应的根节点后,就分别比较B的子树和找到的节点的子树,如果相同,那么B就是A的子结构;如果不相同,那么就不是A的子结构。(注意A,B树是否为空,树的边界判断是非常重要的,一不小心,程序就会崩溃)
代码如下:
import java.util.*;
public class Main19
{
public static void main(String[] args) //用笨方法建了个简单的二叉树,进行的测试 = =
{
TreeNodes Aroot = new TreeNodes(8);
TreeNodes Aroot1 = new TreeNodes(8);
TreeNodes Aroot2 = new TreeNodes(7);
TreeNodes Aroot3 = new TreeNodes(9);
TreeNodes Aroot4 = new TreeNodes(2);
TreeNodes Aroot5 = new TreeNodes(4);
Aroot.left = Aroot1;
Aroot.right = Aroot2;
Aroot1.left = Aroot3;
Aroot1.right = Aroot4;
Aroot4.left = Aroot5;
TreeNodes Broot = new TreeNodes(8);
TreeNodes Broot1 = new TreeNodes(9);
TreeNodes Broot2 = new TreeNodes(2);
Broot.left = Broot1;
Broot.right = Broot2;
System.out.println(HasSubTree(Aroot, Broot));
}
public static boolean HasSubTree(TreeNodes ARoot,TreeNodes BRoot) //查找是否有相应的B的子树
{
boolean hasTree = false;
if(ARoot!=null && BRoot!=null)
{
if(ARoot.val==BRoot.val)
{
hasTree = NodeEquelVal(ARoot,BRoot); //找到根节点后,检查其子树是否匹配
}
if(!hasTree) //如果没找到相应的根节点或者其他节点不匹配,那么就遍历A树的左子树查找
{
hasTree = HasSubTree(ARoot.left, BRoot);
}
if(!hasTree) //遍历右子树
{
hasTree = HasSubTree(ARoot.right, BRoot);
}
}
return hasTree;
}
public static boolean NodeEquelVal(TreeNodes ARoot,TreeNodes BRoot) //找到根节点后,检查子树是否匹配
{
if(BRoot==null)
return true;
if(ARoot==null)
return false;
if(ARoot.val!=BRoot.val)
return false;
return NodeEquelVal(ARoot.left, BRoot.left) && NodeEquelVal(ARoot.right, BRoot.right); //使用递归判断子树节点是否相等
}
}
class TreeNodes //二叉树的节点类
{
int val;
TreeNodes left = null;
TreeNodes right = null;
public TreeNodes(int val)
{
this.val = val;
}
}
本人经验,仅供参考!
输入两颗二叉树A,B,判断B是不是A的子结构。
思路:题目已经指出是二叉树,B是A的子结构即B是否为A的一部分。大概分为两步:1.首先通过B的根节点,遍历A树找此节点在A中的位置。2.找到相应的根节点后,就分别比较B的子树和找到的节点的子树,如果相同,那么B就是A的子结构;如果不相同,那么就不是A的子结构。(注意A,B树是否为空,树的边界判断是非常重要的,一不小心,程序就会崩溃)
代码如下:
import java.util.*;
public class Main19
{
public static void main(String[] args) //用笨方法建了个简单的二叉树,进行的测试 = =
{
TreeNodes Aroot = new TreeNodes(8);
TreeNodes Aroot1 = new TreeNodes(8);
TreeNodes Aroot2 = new TreeNodes(7);
TreeNodes Aroot3 = new TreeNodes(9);
TreeNodes Aroot4 = new TreeNodes(2);
TreeNodes Aroot5 = new TreeNodes(4);
Aroot.left = Aroot1;
Aroot.right = Aroot2;
Aroot1.left = Aroot3;
Aroot1.right = Aroot4;
Aroot4.left = Aroot5;
TreeNodes Broot = new TreeNodes(8);
TreeNodes Broot1 = new TreeNodes(9);
TreeNodes Broot2 = new TreeNodes(2);
Broot.left = Broot1;
Broot.right = Broot2;
System.out.println(HasSubTree(Aroot, Broot));
}
public static boolean HasSubTree(TreeNodes ARoot,TreeNodes BRoot) //查找是否有相应的B的子树
{
boolean hasTree = false;
if(ARoot!=null && BRoot!=null)
{
if(ARoot.val==BRoot.val)
{
hasTree = NodeEquelVal(ARoot,BRoot); //找到根节点后,检查其子树是否匹配
}
if(!hasTree) //如果没找到相应的根节点或者其他节点不匹配,那么就遍历A树的左子树查找
{
hasTree = HasSubTree(ARoot.left, BRoot);
}
if(!hasTree) //遍历右子树
{
hasTree = HasSubTree(ARoot.right, BRoot);
}
}
return hasTree;
}
public static boolean NodeEquelVal(TreeNodes ARoot,TreeNodes BRoot) //找到根节点后,检查子树是否匹配
{
if(BRoot==null)
return true;
if(ARoot==null)
return false;
if(ARoot.val!=BRoot.val)
return false;
return NodeEquelVal(ARoot.left, BRoot.left) && NodeEquelVal(ARoot.right, BRoot.right); //使用递归判断子树节点是否相等
}
}
class TreeNodes //二叉树的节点类
{
int val;
TreeNodes left = null;
TreeNodes right = null;
public TreeNodes(int val)
{
this.val = val;
}
}
本人经验,仅供参考!
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树