• 树的子结构


    题目描述
    输入两棵二叉树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);
    
    	}
    
  • 相关阅读:
    2019-8-31-win10-uwp-使用-WinDbg-调试
    PHP simplexml_import_dom() 函数
    PHP asXML() 函数
    PHP registerXPathNamespace() 函数
    PHP getNamespaces() 函数
    PHP getName() 函数
    查看收集统计信息的时间间隔
    SPOJ DISQUERY LCA + 倍增
    洛谷P3958 奶酪 并查集
    洛谷P2678 跳石头
  • 原文地址:https://www.cnblogs.com/lishanlei/p/10707732.html
Copyright © 2020-2023  润新知