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ù)完整代碼示例
Java 蒙特卡洛算法求圓周率近似值實(shí)例詳解
java實(shí)現(xiàn)的各種排序算法代碼示例
如有不足之處,歡迎留言指出。
上一篇:Java編程實(shí)現(xiàn)NBA賽事接口調(diào)用實(shí)例代碼
欄 目:Java編程
本文標(biāo)題:Java編程求二叉樹(shù)的鏡像兩種方法介紹
本文地址:http://mengdiqiu.com.cn/a1/Javabiancheng/8420.html
您可能感興趣的文章
- 01-10Java咖啡館(1)——嘆咖啡
- 01-10Java Socket編程(三) 服務(wù)器Sockets
- 01-10Java進(jìn)階:Struts多模塊的技巧
- 01-10Java Socket編程(一) Socket傳輸模式
- 01-10Java Socket編程(二) Java面向連接的類(lèi)
- 01-10Java運(yùn)行時(shí)多態(tài)性的實(shí)現(xiàn)
- 01-10Java經(jīng)驗(yàn)點(diǎn)滴:處理沒(méi)有被捕獲的異常
- 01-10Java Socket編程(四) 重復(fù)和并發(fā)服務(wù)器
- 01-10Java中的浮點(diǎn)數(shù)分析
- 01-10面向?qū)ο缶幊?Java中的抽象數(shù)據(jù)類(lèi)型


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹(shù)的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 01-10Java咖啡館(1)——嘆咖啡
- 01-10JVM的垃圾回收機(jī)制詳解和調(diào)優(yōu)
- 01-10Java Socket編程(三) 服務(wù)器Sockets
- 01-10Java進(jìn)階:Struts多模塊的技巧
- 01-10J2SE 1.5版本的新特性一覽
- 01-10Java Socket編程(一) Socket傳輸模式
- 01-10Java運(yùn)行時(shí)多態(tài)性的實(shí)現(xiàn)
- 01-10Java Socket編程(二) Java面向連接的類(lèi)
- 01-10Java Socket編程(四) 重復(fù)和并發(fā)服務(wù)
- 01-10Java經(jīng)驗(yàn)點(diǎn)滴:處理沒(méi)有被捕獲的異常
隨機(jī)閱讀
- 01-10delphi制作wav文件的方法
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-10C#中split用法實(shí)例總結(jié)
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 01-11Mac OSX 打開(kāi)原生自帶讀寫(xiě)NTFS功能(圖文
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 04-02jquery與jsp,用jquery