zoukankan      html  css  js  c++  java
  • java基础编程——树的子结构

    题目描述

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

    题目代码

    /**
     * 输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
     * Created by YuKai Fan on 2018/9/3.
     */
    public class HasSubTree {
        public static void main(String[] args) {
            TreeNode a = new TreeNode(2);
            a.left = new TreeNode(4);
            a.right = new TreeNode(6);
            a.left.left = new TreeNode(7);
            a.left.right = new TreeNode(9);
            a.right.right = new TreeNode(21);
            a.right.left = new TreeNode(14);
    
            TreeNode a1 = new TreeNode(2);
            a1.left = new TreeNode(4);
            a1.right = new TreeNode(6);
            boolean b = hasSubTree(a, a1);
            System.out.println(b);
        }
    
        public static boolean hasSubTree(TreeNode root1, TreeNode root2) {
            boolean result = false;
            //判断前提两个树都是非空的
            if (root1 != null && root2 != null) {
                //如果存在root1的节点与root2的根节点相等
                if (root1.val == root2.val) {
                    //以root2的根节点为起点判断是否包含root2
                    result = isSubTree(root1, root2);
                }
                //如果找不到,就去root1的左子树循环递归
                if (!result) {
                    result = hasSubTree(root1.left, root2);
                }
                //如果左子树也找不到,就去root1的右子树循环递归
                if (!result) {
                    result = hasSubTree(root1.right, root2);
                }
            }
            return result;
        }
        public static boolean isSubTree(TreeNode root1, TreeNode root2) {
            //如果root2遍历完了都能在root1中对应上,返回true
            if (root2 == null) {
                return true;
            }
            //如果root1遍历完了,而root2还没结束,则说明root1不包含root2 ,返回false
            if (root1 == null) {
                return false;
            }
            //如果其中有一个点没有对应上,返回false
            if (root1.val != root2.val) {
                return false;
            }
            //如果根节点对应上,那么就分别去子节点中匹配
            return isSubTree(root1.left, root2.left) && isSubTree(root1.right, root2.right);
        }
    }
    /**
     * Created by YuKai Fan on 2018/9/3.
     */
    public class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;
        TreeNode(int val) {
            this.val = val;
        }
    
    }

    题目延伸

    二叉树的子树和子结构

      子树的意思是只要包含了一个节点,就必须包含这个节点下的所有节点

      子结构的意思是包含了一个节点,可以取左子树或者右子树,或者都不取

    简单的说,就是子结构可以是树的任何一部分

    下面举个简单的例子:

    如下图1是7节点,高度为3的二叉树

    图1:

      

    图1的子树可以是:

    图1的子结构为:

    由于子结构可以是原树的任意一个部分,因此图4就是一个子结构。

     

    如何判断二叉树的子树

    分析:因为子树表示,如果包含了一个节点,就必须包括节点下的所有节点。(所以上图4,不是树的子树。而是子结构!!!)

    所以代码在上面的基础上修改isSubTree()的代码

    public static boolean isSubTree2(TreeNode root1, TreeNode root2) {
            /*因为子树表示,如果包含了一个节点,就必须包括节点下的所有节点。
              所以只有当root1与root2同时遍历结束都为空时,才能返回true
            */
            if (root1 == null && root2 == null) {
                return true;
            } else if (root1 != null && root2 != null) {
                if (root1.val != root2.val) {
                    return false;
                }
                return isSubTree2(root1.left,root2.left) && isSubTree2(root1.right, root2.right);
            } else {
                return false;
            }
        }
  • 相关阅读:
    【转】以太坊分片:Overview and Finality
    Raiden Network — Ethereum 区块链支付通道
    ERC 和 EIP 代表什么呢?
    【转】什么是加密经济学
    Ethereum Probabilistic Micropayments
    【转】以太坊钱包分析与介绍
    【转】用Python从零开始创建区块链
    【转】用 Go 构建一个区块链
    通用权限管理系统组件 (GPM
    通用权限管理系统组件 (GPM
  • 原文地址:https://www.cnblogs.com/FanJava/p/9578702.html
Copyright © 2011-2022 走看看