Java編程求二叉樹(shù)的鏡像兩種方法介紹
給出一棵二叉樹(shù),求它的鏡像,如下圖:右邊是二叉樹(shù)是左邊二叉樹(shù)的鏡像。

仔細(xì)分析這兩棵樹(shù)的特點(diǎn),看看能不能總結(jié)出求鏡像的步驟。這兩棵樹(shù)的根節(jié)點(diǎn)相同,但他們的左右兩個(gè)子節(jié)點(diǎn)交換了位置。因此我們不妨先在樹(shù)中交換根節(jié)點(diǎn)的兩個(gè)子節(jié)點(diǎn),就得到了下面一幅圖中的第二顆樹(shù)
解法1(遞歸)
思路1:如果當(dāng)前節(jié)點(diǎn)為空,返回,否則交換該節(jié)點(diǎn)的左右節(jié)點(diǎn),遞歸的對(duì)其左右節(jié)點(diǎn)進(jìn)行交換處理。
/*class TreeNode{
int val;
TreeNode left=null;
TreeNode right=null;
public TreeNode(int val) {
this.val = val;
}
}*/
public static void mirrorTree(TreeNode root)
{
if(root==null)
return;
//交換該節(jié)點(diǎn)指向的左右節(jié)點(diǎn)。
TreeNode temp=root.left;
root.left=root.right;
root.right=temp;
//對(duì)其左右孩子進(jìn)行鏡像處理。
mirrorTree(root.left);
mirrorTree(root.right);
}
交換過(guò)程如下圖:

交換根節(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ù)的鏡像。
思路2:如果當(dāng)前節(jié)點(diǎn)為 null,返回 null ,否則先分別對(duì)該節(jié)點(diǎn)的左右孩子進(jìn)行鏡像處理,然后將該節(jié)點(diǎn)的左指針指向右孩子,右指針指向左孩子,對(duì)該節(jié)點(diǎn)進(jìn)行鏡像處理。
/*class TreeNode{
int val;
TreeNode left=null;
TreeNode right=null;
public TreeNode(int val) {
this.val = val;
}
}*/
public static TreeNode mirrorTree1(TreeNode root)
{
if(root==null)
return null;
//對(duì)左右孩子鏡像處理
TreeNode left=mirrorTree1(root.left);
TreeNode right=mirrorTree1(root.right);
//對(duì)當(dāng)前節(jié)點(diǎn)進(jìn)行鏡像處理。
root.left=right;
root.right=left;
return root;
}
解法2(非遞歸)
思路1:層次遍歷,根節(jié)點(diǎn)不為 null 將根節(jié)點(diǎn)入隊(duì),判斷隊(duì)不為空時(shí),節(jié)點(diǎn)出隊(duì),交換該節(jié)點(diǎn)的左右孩子,如果左右孩子不為空,將左右孩子入隊(duì)。
public static void mirrorTreeWithQueue(TreeNode root)
{
if(root==null)
return;
//如果樹(shù)為 null 直接返回。否則將根節(jié)點(diǎn)入隊(duì)列。
Queue<TreeNode> queue= new LinkedList<TreeNode>() ;
queue.add(root);
while(!queue.isEmpty())
{
//隊(duì)列不為空時(shí),節(jié)點(diǎn)出隊(duì),交換該節(jié)點(diǎn)的左右子樹(shù)。
TreeNode root1=queue.poll();
/*TreeNode left,right;
left=root1.left;
right=root1.right;
root1.right=left;
root1.left=right;
*/
Swap(root);
if(root1.right!=null)
{
queue.add(root1.right);
//如果左子樹(shù)不為 null 入隊(duì)
}
if(root1.left!=null)
{
queue.add(root1.left);
//如果右子樹(shù)不為 null 入隊(duì)。
}
}
}
public static void Swap(TreeNode root)
{
TreeNode temp;
temp=root.right;
root.right=root.left;
root.left=temp;
}
思路2:先序遍歷,如果根節(jié)點(diǎn)不為 null 將根節(jié)點(diǎn)入棧,當(dāng)棧不為 null 出棧,交換左右節(jié)點(diǎn),如果左右節(jié)點(diǎn)不為 null 入棧。
public static void mirrorTreeWithStack(TreeNode root)
{
if(root==null)
return;
Stack<TreeNode> stack=new Stack<TreeNode>();
stack.push(root);
while(!stack.isEmpty())
{
//當(dāng)棧不為 null 時(shí)出棧,交換左右子樹(shù)。
TreeNode root1=stack.pop();
/*TreeNode left,right;
left=root1.left;
right=root1.right;
root1.right=left;
root1.left=right;*/
Swap(root);
if(root1.right!=null)
{
//右子樹(shù)不為 null 入棧
stack.push(root1.right);
}
if(root1.left!=null)
{
//左子樹(shù)不為 null 入棧
stack.push(root1.left);
}
}
}
public static void Swap(TreeNode root)
{
TreeNode temp;
temp=root.right;
root.right=root.left;
root.left=temp;
}
總結(jié)
以上就是本文關(guān)于Java編程求二叉樹(shù)的鏡像兩種方法介紹的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站:
java算法實(shí)現(xiàn)紅黑樹(shù)完整代碼示例
如有不足之處,歡迎留言指出。
相關(guān)文章
Java實(shí)現(xiàn)簡(jiǎn)單聊天機(jī)器人
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡(jiǎn)單聊天機(jī)器人,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07
ObjectInputStream 和 ObjectOutputStream 介紹_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
ObjectInputStream 和 ObjectOutputStream 的作用是,對(duì)基本數(shù)據(jù)和對(duì)象進(jìn)行序列化操作支持。本文給大家詳細(xì)介紹了ObjectInputStream 和 ObjectOutputStream的相關(guān)知識(shí),感興趣的朋友一起學(xué)習(xí)吧2017-05-05
SpringBoot集成MyBatis對(duì)管理員的查詢操作
本文主要介紹了SpringBoot集成MyBatis對(duì)管理員的查詢操作,實(shí)現(xiàn)增刪改查中的查詢操作,對(duì)所有的普通管理員進(jìn)行查詢操作,感興趣的可以了解一下2023-11-11
Java中鎖的實(shí)現(xiàn)和內(nèi)存語(yǔ)義淺析
這篇文章主要給大家介紹了關(guān)于Java中鎖的實(shí)現(xiàn)和內(nèi)存語(yǔ)義的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-11-11
java 實(shí)現(xiàn)MD5加密算法的簡(jiǎn)單實(shí)例
這篇文章主要介紹了java 實(shí)現(xiàn)MD5加密算法的簡(jiǎn)單實(shí)例的相關(guān)資料,這里提供實(shí)例幫助大家應(yīng)用這樣的加密算法,需要的朋友可以參考下2017-09-09
spring boot加載freemarker模板路徑的方法
這篇文章主要介紹了spring boot加載freemarker模板路徑的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11

