zoukankan      html  css  js  c++  java
  • 树的子结构

    题目描述
    输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)

    分析
    在这里插入图片描述
    查找A中是否存在树B结构一样的子树,可以分为两步:
    第一步,在树A中找到和树B的根节点的值一样的节点R
    第二步,判断A中以R为根节点的子树是不是包含和树B一样的结构

    以上面为例,先在A中找到值为8的节点,接着判断树A的根节点下面的子树是不是含有和树B一样的结构。在A中根节点的左子节点为8,而树B的根节点的左子节点为9,对应两个节点不同。
    接着找8的节点,在A中第二层找到,然后进行第二步的判断(判断这个节点下面的子树是否含有树B一样的结构)

    代码
    第一步

    	public boolean HasSubtree(TreeNode root1,TreeNode root2) {
    
    		boolean result = false;
    
    		//当root1和root2都不为null的时候,才进行比较。否则直接返回false
    		if(root1 != null && root2 != null) {
    			//如果找到了对应root2的根节点的点
    			if(root1.val == root2.val) {
    				//以这个根节点为为起点判断是否包含root2
    				result = DoesTreeHaveTree2(root1, root2);
    			}
    
    			if(!result) {
    				//如果找不到,那么就再去root1的左儿子当作起点,去判断时候包含root2
    				result = HasSubtree(root1.left, root2);
    			}
    
    			if(!result) {
    				//如果还找不到,那么就再去root1的右儿子当作起点,去判断时候包含root2
    				result = HasSubtree(root1.right, root2);
    			}
    		}
    		return result;
    	}
    

    第二步

    	public boolean DoesTreeHaveTree2(TreeNode node1, TreeNode node2) {
    
    		//如果node2已经遍历完了都能对应的上,返回true
    		if(node2 == null) {
    			return true;
    		}
    
    		//如果node2还没有遍历完,node1却遍历完了。返回false
    		if(node1 == null) {
    			return false;
    		}
    
    		//如果其中有一个点没有对应上,返回false
    		if(node1.val != node2.val) {
    			return false;
    		}
    
    		//如果根节点对应的上,那么就分别去子节点里面匹配
    		return DoesTreeHaveTree2(node1.left, node2.left) && DoesTreeHaveTree2(node1.right, node2.right);
    
    	}
    
  • 相关阅读:
    Unity3D 学习笔记一
    Java 常用类 -Math
    Java 常用类 -String VS StringBuffer
    Java 日期类 Calendar SimpleDateFormat
    Java 日期类 Calendar
    Java异常处理-自定义异常
    Java异常处理-Exception 和 RuntimeException 区别
    Java异常处理-throws和throw关键字
    Java异常处理-捕获和处理异常
    Java异常处理-异常的概念
  • 原文地址:https://www.cnblogs.com/lishanlei/p/10707732.html
Copyright © 2011-2022 走看看