• 算法面试题-拓扑结构相同子树


    题目:

    解析:

    这个题目的目的很明确,就是判断A是否包含B。这里的做法是对两颗二叉树分别求先序遍历,接着比较。但是要注意的是,先序遍历需要进行特殊处理。

    举例:

    先对整A棵树进行先序遍历,序列为12453。

    情况一:假设B二叉树只有一个节点3,那么B子树的先序遍历序列就是3,接着判断3是否为12453的子串,这里显然是,但是这只是简单的一种情况。

    情况二:假设B二叉树只有一个节点2,那么如果直接判断2是否为12453的子串是不能得到正确的答案的,因为A中2还有子节点,所以在遍历A树的时候要进行一些处理。

    处理的方法就是,如果一个节点的左子树为空,在序列后加上一个特殊符号(不能是二叉树节点),比如“-”,当右子树为空时加上“+”,这样问题就解决了。

    处理后A的序列为124-+5-+3-+ (相当于把叶子节点标示出来)

    回到情况二,这个时候如果B树的遍历序列变成了2-+,这个串并不是A序列的子串,所以正确。

    代码:

     1 package com.fndroid;
     2 
     3 
     4 public class Main {
     5 
     6     public static void main(String[] args) {
     7         Main main = new Main();
     8         main.chkIdentical(null, null);
     9     }
    10 
    11     public boolean chkIdentical(TreeNode A, TreeNode B) {
    12         StringBuilder sb1 = new StringBuilder();
    13         un(A, sb1);
    14         StringBuilder sb2 = new StringBuilder();
    15         un(B, sb2);
    16         return sb1.toString().contains(sb2.toString()); // 子串判断
    17     }
    18 
    19     public void un(TreeNode root, StringBuilder sb) {
    20         sb.append(root.val);
    21         if (root.left != null) {
    22             un(root.left, sb);
    23         }else{
    24             sb.append("-"); // 标识叶子节点
    25         }
    26         if (root.right != null) {
    27             un(root.right, sb);
    28         }else{
    29             sb.append("+");
    30         }
    31     }
    32 
    33     public class TreeNode {
    34         int val = 0;
    35         TreeNode left = null;
    36         TreeNode right = null;
    37 
    38         public TreeNode(int val) {
    39             this.val = val;
    40         }
    41     }
    42 }
  • 相关阅读:
    VIM配置
    VSCode配置Import@路径
    Sar
    VIM-Fold折叠
    sysctl
    java8 到 java14新增的特性
    Electron整合VUE
    使用Markfile开发GO程序
    cron 表达式
    java spi
  • 原文地址:https://www.cnblogs.com/Fndroid/p/6268660.html
Copyright © 2020-2023  润新知