題目:給定一棵樹,每個節(jié)點(diǎn)值為0或1,每次操作可以選擇一個節(jié)點(diǎn),將其值與1異或,并且所有與該節(jié)點(diǎn)距離為偶數(shù)的節(jié)點(diǎn)的值也與1異或。問最少需要多少次操作,可以使所有節(jié)點(diǎn)值都為0?思路:1. 隨意選擇一個節(jié)點(diǎn)作為根節(jié)點(diǎn),根節(jié)點(diǎn)的高度為0,是偶數(shù),則其他所有節(jié)點(diǎn)都有一個高度,高度的奇偶性可以確定。2. 如果一個節(jié)點(diǎn)值為0,則與1異或后,節(jié)點(diǎn)值變?yōu)?;反之亦然。所以,節(jié)點(diǎn)值與1異或其實(shí)就是做了翻轉(zhuǎn)操作。3. 如果有兩個同一條路徑上的高度為奇數(shù)(或偶數(shù))的節(jié)點(diǎn)都做了翻轉(zhuǎn)操作,則該路徑上接下來高度為奇數(shù)(或偶數(shù))的節(jié)點(diǎn)不需要翻轉(zhuǎn)。所以可以采用DFS,用一個變量oddReverse表示奇數(shù)高度的節(jié)點(diǎn)需要翻轉(zhuǎn),另一個變量evenReverse表示偶數(shù)高度的節(jié)點(diǎn)需要翻轉(zhuǎn)。遍歷當(dāng)前節(jié)點(diǎn)時,首先判斷當(dāng)前節(jié)點(diǎn)的高度是奇數(shù)還是偶數(shù)。以奇數(shù)為例,如果oddReverse為真,如果節(jié)點(diǎn)本身是1,則正常翻轉(zhuǎn)即可,如果節(jié)點(diǎn)本身是0,則翻轉(zhuǎn)后變?yōu)?不符合要求,所以需要再次翻轉(zhuǎn),即操作次數(shù)加1,oddReverse變?yōu)榧伲蝗绻鹢ddReverse為假,如果節(jié)點(diǎn)本身是1,則需要翻轉(zhuǎn),即操作次數(shù)加1,oddReverse變?yōu)檎?,如果?jié)點(diǎn)本身是0,則不需要翻轉(zhuǎn)。最后遍歷所有子節(jié)點(diǎn),將高度加1,oddReverse和evenReverse作為參數(shù)傳遞進(jìn)遞歸函數(shù)。