二叉樹題型框架3

老話放在前面根據題意,思考一個二叉樹節點須要作什麼,到底用什麼遍歷順序就清楚了
尋找重複的子樹
選區_169.png
對於某個節點,如何知道本身是否是重複的
1.以我爲根的這棵二叉樹(子樹)長啥樣?
2.以其餘節點爲根的子樹都長啥樣?
咱們如何知道本身長啥樣呢,能夠用後序遍歷的框架來解決
void traverse(TreeNode root){
traverse(root.left);
traverse(root.right);
}
這樣咱們就知道本身長成什麼樣了
因此,咱們能夠經過拼接字符串的方式來把二叉樹序列化,看下代碼框架

String traverse(TreeNode root){
//對於空節點,能夠用一個特殊字符來表示
 if(root==null){
 return "#";
 }
 
 //將左右子樹序列化爲字符串
 String left=traverse(root.left);
 String right=traverse(root.right);
 //後序遍歷位置
 //左右子樹加上本身,就是以本身爲根的二叉樹
 String subTree=left+","+right+","+root.val;
 return subTree;
}

咱們用非數字的特殊符#表示空指針,而且用字符,分隔每一個二叉樹節點值,這屬於序列化二叉樹的套路。
對於每一個節點來講,遞歸函數中的subTree變量就能夠描述以該節點爲根的二叉樹
接下來,如何知作別人長什麼樣?
咱們能夠建立一個外部變量,經過將序列化後的結果保存在其中,那麼咱們就能夠知作別人是否是已經有過了,若是已經存在的話,東哥的代碼也解釋了一開始使用的是Set結構,那麼作完對比的結果就有多個重複的res,因此使用HashMap。函數

HashMap<String,Integer> memo=new HashMap<>();

LinkedList<TreeNode> res=new LinkedList<>();

List<TreeNode> findDuplicationSubtrees(TreeNode root){
traverse(root);
return res;
}

String traverse(TreeNode root){
if(root==null){
return "#";
}

String left=traverse(root.left);
String right=traverse(root.right);

String subTree=left+","+right+","+root.val;

int freq=meomo.getOrDefault(subTree,0);
if(freq==1){
res.add(root);
}

memo.put(subTree,freq+1);
return subTree;
}
相關文章
相關標籤/搜索