您的位置:首页 > Web前端

剑指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;
}
}


本人经验,仅供参考!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 编程