前言
之前記錄過二叉樹的遍歷方法。 這次記錄一下二叉樹的鏡像樹。 就我個人而言,我不喜歡太多的文字。
1.什么是鏡像樹?
鏡樹,簡單的理解就是中間放一個全身鏡,全身鏡的內(nèi)側(cè)和外側(cè)的關(guān)系是對稱的。讓我想起了平面鏡成像
鏡像樹無非就是A、B、C有樹關(guān)系,頭部的鏡像就是它自己
我簡單解釋一下:
C節(jié)點:C是根節(jié)點,C的鏡像節(jié)點就是C‘
B節(jié)點:C的左節(jié)點B = C'的右節(jié)點B‘
A節(jié)點:B的左節(jié)點A = B‘的右節(jié)點A’ 且 B的右節(jié)點null = B’的左節(jié)點
2. 鏡像樹的應(yīng)用場景
目前大多在哪里遇到:刷題
我還沒有遇到過具體的應(yīng)用場景,所以在這里留下記錄,等以后遇到了再補充。
3.如何確認(rèn)這是一棵鏡像樹
剛才提到應(yīng)用場景是刷題。 這是李口原來的問題。 我不會發(fā)布問題的具體描述。 如果有需要,您可以點擊下面的鏈接來進(jìn)行操作。 基本上,這意味著給你一個樹的頭節(jié)點。 ,你這樣填充,讓這個技巧
101.對稱二叉樹
Sword指的是。 對稱二叉樹
先別急著寫代碼,先考慮如何判斷一個節(jié)點是否鏡像(對稱)。
我懷里有兩個孩子,右邊的女兒和右邊的女兒一樣
左頭==右頭
假設(shè)我們有這樣一個方法來判斷一個節(jié)點是否是鏡像平面鏡成像規(guī)律圖表,那么我們只要一層層遞歸就可以得到整棵樹是否是鏡像的技巧了?
下面是寫法:
初始根節(jié)點,將自身與自身進(jìn)行比較以確定邊界條件:
2.1 如果兩個節(jié)點其中一個不為空,另一個為空,則直接返回false。
2.2 如果兩個節(jié)點都為空,則直接返回true。 當(dāng)判斷兩個節(jié)點的值是否相同時,如果相同則遞歸進(jìn)行。
public boolean isSymmetric(TreeNode root) {
return isSameNode(root,root);
}
public static boolean isSameNode(TreeNode p, TreeNode q) {
if (p == null ^ q == null) {
return false;
}
if (p == null && q == null) {
return true;
}
return p.val == q.val && isSameNode(p.left, q.right) && isSameNode(p.right, q.left);
}
四、回顧二叉樹的遍歷方法
之前寫過二叉樹的遍歷方法:前序、中序、后序
優(yōu)先順序:先左后右
中間順序:先左,后頭,再右
后續(xù)順序:先左,后右平面鏡成像規(guī)律圖表,最后頭
后來寫完復(fù)制代碼后,提出了遞歸順序:每個節(jié)點進(jìn)入3次。
第一個復(fù)制結(jié)果中,是預(yù)購的
第二次復(fù)制的結(jié)果是中序的
第三個副本的結(jié)果是后序
再次手寫遞歸序列代碼:
public void ds(TreeNode head){
//邊界條件
if(head==null){
return;
}
//第一次進(jìn)head節(jié)點
System.out.println("我是先序:"+head.val);
ds(head.left);
//第二次進(jìn)head節(jié)點
System.out.println("我是中序:"+head.val);
ds(head.right);
//第三次進(jìn)head節(jié)點
System.out.println("我是后序:"+head.val);
}