題目描述
給你一棵二叉樹,每個節點的值爲 1 到 9 。我們稱二叉樹中的一條路徑是 「僞迴文」的,當它滿足:路徑經過的所有節點值的排列中,存在一個迴文序列。
請你返回從根到葉子節點的所有路徑中 僞迴文 路徑的數目。
題目分析
看到本題目,首先想到的是要把從根節點到葉子節點的路徑上的值存儲下來,當到達葉子節點後,對當前路徑上的值進行分析。由題意「每個節點的值爲1到9」,所以一個大小爲10的數組就可以統計路徑上的節點值。
如果當前路徑上,「相同節點值出現頻度次數爲奇數」的次數 > 1,那麼當前路徑上的節點值一定不是符合要求的“僞迴文”的答案。“僞迴文”的要求是經過排序後,節點值可以組成一個迴文數組。反之,當「相同節點值出現頻度次數爲奇數」的次數 <= 1,其他節點值頻度次數爲偶數,那麼就一定是符合“僞迴文”的答案。
參考代碼
public class PseudoPalindromicPaths {
// 記錄符合要求的路徑數
int r = 0;
private void go(TreeNode rt, int[] d) {
if (rt == null) {
return;
}
// 當前節點的值+1
d[rt.val]++;
// 當前節點爲葉子節點。
if (rt.left == null && rt.right == null) {
int ct = 0;
// 統計當前的路徑上,值爲奇數的個數。如果爲奇數的個數 > 1,那麼一定不能組成迴文串。
for (int i = 1; i <= 9; ++i) {
if (d[i] % 2 == 1) {
ct++;
}
}
// 如果爲奇數的值爲1或0,則是一個符合要求的答案。
if (ct == 1 || ct == 0) {
r++;
}
// 當前值--,意味着回到當前節點的父節點。
d[rt.val]--;
return;
}
// 遞歸處理
go(rt.left, d);
go(rt.right, d);
d[rt.val]--;
}
// 使用遞歸的方法來解決。
public int pseudoPalindromicPaths(TreeNode root) {
go(root, new int[10]);
return r;
}
}