树的子结构-剑指Offer

树的子结构

题目描述

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

思路

分两步来实现

  1. 先判断Tree1里的节点有没有和Tree2的根节点相同值得节点,递归的判断,若有,侧判断第二步,否则,返回false
  2. 从这个有相同值的节点开始判断,递归的左右对应的判断子树是否相等,注意空指针的情况
  3. 注意:在编写遍历树的代码时一定要高度警惕,在每一处要访问地址的时候都要问问自己这个地址有没有可能是NULL,如果是该怎么处理。(为了确保自己代码的完整正确,写完代码后要多用几个测试用例检验自己的程序)

代码

/**
public 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 result = false;
		if (root1 != null && root2 != null) {
			if (root1.val == root2.val) {
				
				result = DoesTree1HasTree2(root1, root2);
			}
			if (!result) {
				result = HasSubtree(root1.left, root2);
			}
			if (!result) {
				result = HasSubtree(root1.right, root2);
			}
		}
		return result;
    }
	public boolean DoesTree1HasTree2(TreeNode root1, TreeNode root2) {
		if (root2 == null) {
			return true;
		}
		if (root1 == null) {
			return false;
		}
		if (root1.val != root2.val) {
			return false;
		}
		return DoesTree1HasTree2(root1.left, root2.left) && DoesTree1HasTree2(root1.right, root2.right);
	}
}
posted @ 2016-06-26 16:31  RosenDing  阅读(158)  评论(0编辑  收藏  举报