Fndroid

题目:

 

解析:

这个题目的目的很明确,就是判断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 }

 

分类:

技术点:

相关文章:

  • 2021-05-13
  • 2021-05-23
  • 2021-08-15
  • 2021-06-24
  • 2021-12-28
  • 2021-08-11
猜你喜欢
  • 2022-01-05
  • 2022-01-25
  • 2022-02-14
  • 2021-09-01
  • 2021-12-27
  • 2022-02-09
相关资源
相似解决方案