zoukankan      html  css  js  c++  java
  • 剑指17.树的子结构

    题目描述

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

    分析

    若树B是树A的子结构,则子结构的根节点可能为树A的任意一个节点。因此,需要完成以下两步操作:
    • 第一步:在树A中找到和树B的根节点的值一样的节点 R (也就是树A的遍历);
    • 第二步:判断树A中以 R 为根节点的子树是不是包含和树B一样的结构。
     
    注意:与二叉树相关的代码有大量的指针操作,每次访问指针地址时要警惕这个指针有没有可能是nullptr,如果是该如何处理?!
     

    ☆☆☆题解

    /**
    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 = DoesTree1HaveTree2(root1,root2);
                //如果找不到,依次遍历左右孩子
                if(!result) result = HasSubtree(root1.left,root2);
                if(!result) result = HasSubtree(root1.right,root2);
            }
            return result;
        }
        public boolean DoesTree1HaveTree2(TreeNode root1,TreeNode root2){
            //判断的顺序很重要,因为root1为null有两种情况
            if(root2 == null) //说明树B已经遍历完了都能对应的上
                return true;
            //注意root1为null有两种情况,(1)root1==null&&root2!=null说明匹配失败;(2)root1==null&&root2==null说明匹配成功。
            if(root1 == null) //如果树B还没有遍历完(root2!=null),树A却遍历完了(root1==null),说明匹配失败
                return false;
            if(root1.val == root2.val){//根节点能对应上,再分别判断左右孩子是否匹配
                return DoesTree1HaveTree2(root1.left,root2.left) && DoesTree1HaveTree2(root1.right,root2.right); 
            }else{
                return false;
            }
        }
    }
  • 相关阅读:
    针式PKM的主要画面的功能简介
    程序员早日走向架构师的利器:针式PKM V8.01发布
    如何经营你的知识资产
    一般软件工程师怎样拥有更多的资产
    剪贴板的使用技巧
    不要给自己找不“深入学习”的理由了
    《小论无所事事》
    全国(1977年~2011年)历年参加高考人数和录取人数
    Sql Server中,文件批量重命名
    HTML斜线表头
  • 原文地址:https://www.cnblogs.com/HuangYJ/p/13470053.html
Copyright © 2011-2022 走看看