最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2017年11月20日 11:48:32   作者:HankingHu  
這篇文章主要介紹了Java編程求二叉樹的鏡像兩種方法介紹,分享了兩種方法,遞歸與非遞歸,每種方法又分別介紹了兩種解決思路,具有一定參考價(jià)值,需要的朋友可以了解下。

給出一棵二叉樹,求它的鏡像,如下圖:右邊是二叉樹是左邊二叉樹的鏡像。

仔細(xì)分析這兩棵樹的特點(diǎn),看看能不能總結(jié)出求鏡像的步驟。這兩棵樹的根節(jié)點(diǎn)相同,但他們的左右兩個(gè)子節(jié)點(diǎn)交換了位置。因此我們不妨先在樹中交換根節(jié)點(diǎn)的兩個(gè)子節(jié)點(diǎn),就得到了下面一幅圖中的第二顆樹

解法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);
}

交換過程如下圖:

交換根節(jié)點(diǎn)的兩個(gè)子節(jié)點(diǎn)之后,我們注意到值為10,6的結(jié)點(diǎn)的子節(jié)點(diǎn)仍然保持不變,因此我們還需要交換這兩個(gè)結(jié)點(diǎn)的左右子節(jié)點(diǎn)。交換之后的結(jié)果分別為第三課樹和第四顆樹。做完這兩次交換之后,我們已經(jīng)遍歷完所有的非葉子結(jié)點(diǎn)。此時(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;
	//如果樹為 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)的左右子樹。
		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);
			//如果左子樹不為 null 入隊(duì)
		}
		if(root1.left!=null)
		      {
			queue.add(root1.left);
			//如果右子樹不為 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í)出棧,交換左右子樹。
		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)
		      {
			//右子樹不為 null 入棧
			stack.push(root1.right);
		}
		if(root1.left!=null)
		      {
			//左子樹不為 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編程求二叉樹的鏡像兩種方法介紹的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站:

java算法實(shí)現(xiàn)紅黑樹完整代碼示例

Java 蒙特卡洛算法求圓周率近似值實(shí)例詳解

java實(shí)現(xiàn)的各種排序算法代碼示例

如有不足之處,歡迎留言指出。

相關(guān)文章

  • springboot使用nacos的示例詳解

    springboot使用nacos的示例詳解

    這篇文章主要介紹了springboot使用nacos的示例代碼,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-12-12
  • Java實(shí)現(xiàn)簡(jiǎn)單聊天機(jī)器人

    Java實(shí)現(xiàn)簡(jiǎn)單聊天機(jī)器人

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡(jiǎn)單聊天機(jī)器人,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • resttemplate設(shè)置params的方法

    resttemplate設(shè)置params的方法

    RestTemplate設(shè)置請(qǐng)求參數(shù)的方式根據(jù)請(qǐng)求類型(GET/POST)和參數(shù)形式(路徑參數(shù)、查詢參數(shù)、JSON請(qǐng)求體)有所不同,下面通過本文給大家介紹resttemplate設(shè)置params的方法,感興趣的朋友一起看看吧
    2025-04-04
  • ObjectInputStream 和 ObjectOutputStream 介紹_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    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ì)管理員的查詢操作

    本文主要介紹了SpringBoot集成MyBatis對(duì)管理員的查詢操作,實(shí)現(xiàn)增刪改查中的查詢操作,對(duì)所有的普通管理員進(jìn)行查詢操作,感興趣的可以了解一下
    2023-11-11
  • Java中鎖的實(shí)現(xiàn)和內(nèi)存語義淺析

    Java中鎖的實(shí)現(xiàn)和內(nèi)存語義淺析

    這篇文章主要給大家介紹了關(guān)于Java中鎖的實(shí)現(xiàn)和內(nèi)存語義的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • java 實(shí)現(xiàn)MD5加密算法的簡(jiǎn)單實(shí)例

    java 實(shí)現(xiàn)MD5加密算法的簡(jiǎn)單實(shí)例

    這篇文章主要介紹了java 實(shí)現(xiàn)MD5加密算法的簡(jiǎn)單實(shí)例的相關(guān)資料,這里提供實(shí)例幫助大家應(yīng)用這樣的加密算法,需要的朋友可以參考下
    2017-09-09
  • JavaWeb會(huì)話技術(shù)詳解與案例

    JavaWeb會(huì)話技術(shù)詳解與案例

    會(huì)話技術(shù):在Web開發(fā)中,服務(wù)器跟蹤用戶信息的奇數(shù)稱為會(huì)話技術(shù)。會(huì)話:指的是一個(gè)客戶端與服務(wù)器發(fā)生的一系列請(qǐng)求和響應(yīng)的過程。由于請(qǐng)求包含的信息,在請(qǐng)求被銷毀后也就不存在,多次讓用戶輸入賬號(hào)密碼,會(huì)影響用戶的使用體驗(yàn)感,基于此,產(chǎn)生了cookie和session技術(shù)
    2021-11-11
  • 解讀CompletableFuture異步多線程的使用方式

    解讀CompletableFuture異步多線程的使用方式

    這篇文章主要介紹了CompletableFuture異步多線程的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • spring boot加載freemarker模板路徑的方法

    spring boot加載freemarker模板路徑的方法

    這篇文章主要介紹了spring boot加載freemarker模板路徑的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11

最新評(píng)論

胶南市| 社旗县| 信阳市| 河源市| 湖口县| 沂水县| 房产| 舒兰市| 菏泽市| 神农架林区| 乌鲁木齐市| 陆川县| 东兰县| 扶绥县| 巴楚县| 即墨市| 万安县| 同江市| 平顶山市| 汤阴县| 汝阳县| 黑山县| 台东市| 丰镇市| 承德县| 齐齐哈尔市| 石台县| 怀来县| 巴南区| 万山特区| 陕西省| 巴东县| 缙云县| 石嘴山市| 怀来县| 桐梓县| 沾化县| 板桥市| 长顺县| 顺平县| 五莲县|