剑指Offer——树的子结构

来源:互联网 发布:手机在线网页源码 编辑:程序博客网 时间:2024/06/14 15:05

题目描述

输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
树节点定义如下:

public class TreeNode {    int val = 0;    TreeNode left = null;    TreeNode right = null;    public TreeNode(int val) {        this.val = val;    }}

解题思路

  1. 先序遍历树A,如果某个节点与树B的根节点值相同,则对该子树进行子结构判断
import java.util.Stack;public class Solution {    public boolean HasSubtree(TreeNode root1,TreeNode root2) {        if(root1==null || root2==null)return false;        Stack<TreeNode> stack = new Stack<TreeNode>();        TreeNode cur = root1;        while(cur!=null || !stack.isEmpty()){            while(cur != null){                if(root2.val == cur.val){                    if(isSubTree(cur, root2))return true;                }                stack.push(cur);                cur = cur.left;            }            cur = stack.pop();            cur = cur.right;        }        return false;    }    private boolean isSubTree(TreeNode root1, TreeNode root2){        if(root2 == null)return true;        else if(root1 == null)return false;        if(root1.val != root2.val)return true;        return isSubTree(root1.left, root2.left) && isSubTree(root1.right, root2.right);    }}
  1. 递归的方式,更加简洁。
public class Solution {    public boolean HasSubtree(TreeNode root1,TreeNode root2) {        if(root1==null || root2==null)return false;        boolean flag = false;        if(root1.val == root2.val){            flag = isSubTree(root1, root2);        }        //左子树中寻找        if(!flag)flag = HasSubtree(root1.left, root2);        //右子树中寻找        if(!flag)flag = HasSubtree(root1.right, root2);        return flag;    }    private boolean isSubTree(TreeNode root1, TreeNode root2){        if(root2 == null)return true;        else if(root1 == null)return false;        if(root1.val != root2.val)return false;        return isSubTree(root1.left, root2.left) && isSubTree(root1.right, root2.right);    }}