首页 > 编程语言 > 详细

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

时间:2017-01-10 12:56:17      阅读:254      评论:0      收藏:0      [点我收藏+]

题目:

技术分享

 

解析:

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

 

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

原文:http://www.cnblogs.com/Fndroid/p/6268660.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!