欧美大屁股bbbbxxxx,狼人大香伊蕉国产www亚洲,男ji大巴进入女人的视频小说,男人把ji大巴放进女人免费视频,免费情侣作爱视频

歡迎來(lái)到入門(mén)教程網(wǎng)!

Java編程

當(dāng)前位置:主頁(yè) > 軟件編程 > Java編程 >

Java編程求二叉樹(shù)的鏡像兩種方法介紹

來(lái)源:本站原創(chuàng)|時(shí)間:2020-01-10|欄目:Java編程|點(diǎn)擊: 次

給出一棵二叉樹(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編程

下一篇:Java編程接口調(diào)用的作用及代碼分享

本文標(biāo)題:Java編程求二叉樹(shù)的鏡像兩種方法介紹

本文地址:http://mengdiqiu.com.cn/a1/Javabiancheng/8420.html

網(wǎng)頁(yè)制作CMS教程網(wǎng)絡(luò)編程軟件編程腳本語(yǔ)言數(shù)據(jù)庫(kù)服務(wù)器

如果侵犯了您的權(quán)利,請(qǐng)與我們聯(lián)系,我們將在24小時(shí)內(nèi)進(jìn)行處理、任何非本站因素導(dǎo)致的法律后果,本站均不負(fù)任何責(zé)任。

聯(lián)系QQ:835971066 | 郵箱:835971066#qq.com(#換成@)

Copyright © 2002-2020 腳本教程網(wǎng) 版權(quán)所有