題目:
請(qǐng)完成一個(gè)函數(shù),輸入一棵二叉樹(shù),該函數(shù)輸出它的鏡像。
如下圖所示,即為兩棵互為鏡像的二叉樹(shù):
思路:
現(xiàn)在我們來(lái)仔細(xì)分析這兩棵樹(shù)的特點(diǎn),總結(jié)出求鏡像的步驟。這兩顆樹(shù)的根節(jié)點(diǎn)相同,但它們的左、右兩個(gè)子節(jié)點(diǎn)交換了位置。因此,我們不妨先在樹(shù)中交換根節(jié)點(diǎn)的兩個(gè)子節(jié)點(diǎn),得到下圖的第二棵樹(shù)。
交換根節(jié)點(diǎn)的兩個(gè)子節(jié)點(diǎn)之后,我們注意到值為10、6的節(jié)點(diǎn)的子節(jié)點(diǎn)仍然保持不變,因此我們還需要交換這兩個(gè)節(jié)點(diǎn)的左、右子節(jié)點(diǎn)。交換之后的結(jié)果分別是下圖的第三棵樹(shù)和第四棵樹(shù)。做完這兩次交換之后,我們已經(jīng)遍歷完所有的非葉節(jié)點(diǎn)。此時(shí)變換之后的樹(shù)剛好就是原始樹(shù)的鏡像。
注:(a)交換根節(jié)點(diǎn)的左、右子樹(shù);(b)交換值為10的節(jié)點(diǎn)的左、右子節(jié)點(diǎn);(c)交換值為6的節(jié)點(diǎn)的左、右子節(jié)點(diǎn)
總結(jié)上面的過(guò)程,我們得出求一棵樹(shù)的鏡像的過(guò)程:先前序遍歷這棵樹(shù)的每個(gè)節(jié)點(diǎn),如果遍歷到的節(jié)點(diǎn)有子節(jié)點(diǎn),就交換它的兩個(gè)子節(jié)點(diǎn)。當(dāng)交換完所有非葉節(jié)點(diǎn)的左、右子節(jié)點(diǎn)之后,就得到了樹(shù)的鏡像。
綜上,python代碼如下:
class TreeNode:
def __init__(self, x):
self.val =x
self.left =None
self.right =None
class Solution:
def Mirror(self, root):
if not root:
return None
root.left, root.right =root.right, root.left
if root.left:
self.Mirror(root.left)
if root.right:
self.Mirror(root.right)
java代碼如下:
//二叉樹(shù)結(jié)構(gòu)定義如下
class BinaryTreeNode{
public int value;
public BinaryTreeNode leftNode;
public BinaryTreeNode rightNode;
public BinaryTreeNode(){
}
public BinaryTreeNode(int value){
this.value =value;
this.leftNode =null;
this.rightNode =null;
}
}
public class MirrorOfBinaryTree{
public void Mirror(BinaryTreeNode node){
if (node ==null)
return;
if (node.leftNode ==null && node.rightNode ==null)
return;
BinaryTreeNode temp =node.leftNode;
node.leftNode =node.rightNode;
node.rightNode =temp;
if(node.leftNode != null)
Mirror(node.leftNode);
if(node.rightNode !=null)
Mirror(node.rightNode);
}
}