Leetcode226. 翻轉二叉樹(遞歸、迭代、層序三種解法)

目錄

    • 題目
    • 1、層序法:
    • 2、遞歸法:
      • 1、先序遍歷(中左右)
      • 2、后序遍歷(左右中)
      • 3、遞歸中序遍歷為什么不行(左中右)
    • 3、迭代法:
      • 1、先序遍歷
      • 2、中序遍歷
      • 3、后序遍歷
      • 為什么迭代法的中序遍歷有效?

題目

翻轉一棵二叉樹。

示例:

輸入:

 4

/
2 7
/ \ /
1 3 6 9
輸出:
4
/
7 2
/ \ /
9 6 3 1

1、層序法:

層序遍歷,然后將同一層的所有結點的左右孩子交換

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution {
public:TreeNode* invertTree(TreeNode* root) {queue<TreeNode*> que;if(root!=NULL) que.push(root);while(!que.empty()){int size = que.size();for(int i =0;i<size;i++){TreeNode* node = que.front();que.pop();TreeNode* tmp;tmp = node->left;node->left = node->right;node->right = tmp;//將左右孩子結點入隊列,作為下一層的元素if(node->left) que.push(node->left);if(node->right) que.push(node->right);}}return root;}
};

在這里插入圖片描述

2、遞歸法:

遍歷的過程中去翻轉每一個結點的左右孩子就可以達到整體翻轉的效果。
可以使用先序遍歷和后序遍歷,而中序遍歷會把某些結點的左右孩子翻轉兩次。

1、先序遍歷(中左右)

遞歸思考過程:
1、返回值:void 形參:指向結點的指針
2、終止條件:指向結點的指針為空指針
3、遞歸內部邏輯:先翻轉指針指向的結點的左右孩子,然后遞歸遍歷左右子樹

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution {
public:void traversal(TreeNode* cur){//終止條件if(cur == NULL) return;//邏輯:先交換左右子樹內容,然后對左右子樹依次進行遍歷TreeNode* tmp;tmp = cur->left;cur->left = cur->right;cur->right = tmp;traversal(cur->left);traversal(cur->right);}TreeNode* invertTree(TreeNode* root) {traversal(root);return root;}
};

在這里插入圖片描述

2、后序遍歷(左右中)

遞歸思考過程:
1、返回值:void 形參:指向結點的指針
2、終止條件:指向結點的指針為空指針
3、遞歸內部邏輯:先遞歸遍歷左右子樹,再翻轉指針指向的結點的左右孩子

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution {
public:void traversal(TreeNode* cur){//終止條件if(cur == NULL) return;traversal(cur->left);traversal(cur->right);TreeNode* tmp;tmp = cur->left;cur->left = cur->right;cur->right = tmp;}TreeNode* invertTree(TreeNode* root) {traversal(root);return root;}
};

為什么后序遍歷的方法更加快捷?
在這里插入圖片描述

3、遞歸中序遍歷為什么不行(左中右)

中序遍歷之后是這樣的:
在這里插入圖片描述
因為交換完左右結點后,想要遍歷右子樹,實際由于進行了交換操作,遍歷的還是原來的左子樹。
如下圖:
在這里插入圖片描述

3、迭代法:

1、先序遍歷

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution {
public:TreeNode* invertTree(TreeNode* root) {stack<TreeNode*> st;if(root !=NULL) st.push(root);while(!st.empty()){TreeNode* node = st.top();  //標記操作,直到遇到NULLif(node!=NULL){//將該結點彈出,避免重復操作st.pop();//添加右結點if(node->right) st.push(node->right);//添加左結點if(node->left) st.push(node->left);//添加中結點st.push(node);//標記st.push(NULL); }//只有遇到空結點的時候,才將下一個結點的左右子結點進行交換else{//彈出空結點st.pop();node = st.top();st.pop();   TreeNode* tmp;tmp = node->left;node->left = node->right;node->right = tmp;}}return root;}
};

2、中序遍歷

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution {
public:TreeNode* invertTree(TreeNode* root) {stack<TreeNode*> st;if(root !=NULL) st.push(root);while(!st.empty()){TreeNode* node = st.top();  //標記操作,直到遇到NULLif(node!=NULL){//將該結點彈出,避免重復操作st.pop();//添加右結點if(node->right) st.push(node->right);//添加中結點st.push(node);//標記st.push(NULL); //添加左結點if(node->left) st.push(node->left);}//只有遇到空結點的時候,才將下一個結點的左右子結點進行交換else{//彈出空結點st.pop();node = st.top();st.pop();   TreeNode* tmp;tmp = node->left;node->left = node->right;node->right = tmp;}}return root;}
};

3、后序遍歷

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution {
public:TreeNode* invertTree(TreeNode* root) {stack<TreeNode*> st;if(root !=NULL) st.push(root);while(!st.empty()){TreeNode* node = st.top();  //標記操作,直到遇到NULLif(node!=NULL){//將該結點彈出,避免重復操作st.pop();//添加中結點st.push(node);//標記st.push(NULL); //添加右結點if(node->right) st.push(node->right);//添加左結點if(node->left) st.push(node->left);}//只有遇到空結點的時候,才將下一個結點的左右子結點進行交換else{//彈出空結點st.pop();node = st.top();st.pop();   TreeNode* tmp;tmp = node->left;node->left = node->right;node->right = tmp;}}return root;}
};

為什么迭代法的中序遍歷有效?

迭代的中序方法可以,因為先將交換前的右子樹值存放到棧內了,即使后面進行了交換,想要遍歷右子樹時,是取棧內交換前的右子樹值,而不是交換后的。
如圖:在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/378031.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/378031.shtml
英文地址,請注明出處:http://en.pswp.cn/news/378031.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Asp.net 獲取當前目錄的三種方法

方法一&#xff1a; string sPath System.IO.Path.GetDirectoryName(Page.Request.PhysicalPath) 方法二&#xff1a; string sPath System.Web.HttpContext.Current.Request.MapPath("/") 方法三&#xff1a; string s…

一款jQuery立體感動態下拉導航菜單特效

一款jQuery立體感動態下拉導航菜單特效,鼠標經過&#xff0c;在菜單欄上方下拉出一個背景圖片&#xff0c;效果十分不錯的一款jquery特效。 對IE6都是兼容的&#xff0c;希望大家好好研究研究。 適用瀏覽器&#xff1a;IE6、IE7、IE8、360、FireFox、Chrome、Safari、Opera、傲…

七、模糊操作

一、模糊操作基本原理 1&#xff0c;基于離散卷積 2&#xff0c;定義好每一個卷積核 3&#xff0c;不同卷積核得到不同的卷積效果 4&#xff0c;模糊是卷積的一種表象 二、1*3卷積核舉例 每次右移一格&#xff0c;進行對應相乘再求和。1*3的卷積核左右兩邊的元素并沒有處理而…

LeetCode 100. 相同的樹 思考分析

給定兩個二叉樹&#xff0c;編寫一個函數來檢驗它們是否相同。 如果兩個樹在結構上相同&#xff0c;并且節點具有相同的值&#xff0c;則認為它們是相同的。 示例 1: 輸入: 1 1 / \ / 2 3 2 3 [1,2,3], [1,2,3]輸出: true 示例 2: 輸入: 1 1 / 2 2 [1,2], [1,null,2]輸…

在Python中以二進制格式輸入數字

Syntax to convert binary value to an integer (decimal format), 將二進制值轉換為整數(十進制格式)的語法&#xff0c; int(bin_value, 2)Here, 這里&#xff0c; bin_value should contain the valid binary value bin_value應該包含有效的二進制值 2 is the base value …

八、邊緣保留濾波(EPF)

一、概念 邊緣保留濾波(EPF,edge preserving filtering) 二、高斯雙邊 cv2.bilateralFilter(image,0,100,15)100為差異&#xff0c;15為周圍的區域 import cv2 import numpy as npdef bilateralFilter(image):dst cv2.bilateralFilter(image,0,100,15)cv2.imshow(bilater…

LintCode 375. 克隆二叉樹(深復制)

先序遍歷構造二叉樹 TreeNode * preorder(TreeNode * root){if(rootNULL) return NULL;TreeNode * ans;ansnew TreeNode(root->val);if(root->left!NULL){ans->leftpreorder(root->left);}if(root->right!NULL){ans->rightpreorder(root->right);}return…

關于ECMAScript基礎入門的分享

目錄 ECMAScript基礎入門1. 介紹2. 變量與數據類型2.1 變量2.2 數據類型 3. 運算符3.1 算術運算符3.2 比較運算符 4. 控制流4.1 條件語句4.2 循環語句 5. 函數6. 對象與數組6.1 對象6.2 數組 7. 總結 ECMAScript基礎入門 1. 介紹 ECMAScript是JavaScript的標準規范&#xff0…

kotlin 計算平方_Kotlin程序來計算復利

kotlin 計算平方Compound interest is the sum of principal amount and interest of interest. 復利是本金和利息之和。 Given, principal, rate, and time, we have to calculate the Compound interest. 給定本金&#xff0c;利率和時間&#xff0c;我們必須計算復利。 Fo…

近代科學為什么誕生在西方-1

寬泛的講&#xff0c;近代科學是幾種文明在長達幾個世紀的持續交流碰撞中產生的。它正在日益成為全世界全人類都有效的普適科學。通向現代科學之路就是通向自由和開放交流之路。 馬克思韋伯和莫頓都認為&#xff0c;科學事業要持續的進步就要特定的文化和制度的支持。 中國的數…

九、圖像直方圖

一、圖像直方圖的屬性 說白了就是將圖像上的各個顏色通道上的像素點的像素值進行統計&#xff0c;例如&#xff1a;像素值為14的像素點個數有幾個&#xff0c;進行顯示。 圖像的像素值取值范圍為[0,255]&#xff0c;這個范圍也成為直方圖的range也就是直方圖的橫坐標軸 每一個…

BIFR的完整形式是什么?

BIFR&#xff1a;工業和金融重組委員會 (BIFR: Board of Industrial and Financial Reconstruction) BIFR is an abbreviation of the Board of Industrial and Financial Reconstruction. It was an organization of the Government of India and a branch of the Department …

LeetCode 101. 對稱二叉樹 思考分析

題目 給定一個二叉樹&#xff0c;檢查它是否是鏡像對稱的。 例如&#xff0c;二叉樹 [1,2,2,3,4,4,3] 是對稱的。 1/ 2 2 / \ / 3 4 4 3 但是下面這個 [1,2,2,null,3,null,3] 則不是鏡像對稱的: 1/ 2 2 \ 3 3 進階&#xff1a; 你可以運用遞歸和迭代兩種方法解決這個…

內心能不能寧靜一點,做事能不能堅持一下

內心能不能寧靜一點&#xff0c;做事能不能堅持一下 每次朋友問我怎么樣&#xff0c;我總感覺不好回答&#xff0c;如果說實話我想他們或許是不能理解我的處境的&#xff0c;只能報以“還好”之類的語言&#xff0c;糊弄一下。唯一一次說了實話是&#xff1a;我墜落了&#xff…

直方圖反向投影

通過直方圖反向投影&#xff0c;根據目標衣服顏色的特征來進行定位 cv2.calcHist([roi_hsv],[0,1],None,[32,48],[0,180,0,256])其中[32,48]表示bin的個數&#xff0c;可以修改&#xff0c;當然范圍越小越精確 import cv2 import numpy as np from matplotlib import pyplot …

javascript 排序_JavaScript中的排序方法

javascript 排序There are tons of sorting algorithms available like bubble sort, merge sort, insertion sort etc. You must have implemented some of these in other programming languages like C or C. But in this article, I will be demonstrating the Sorting met…

LeetCode 二叉樹、N叉樹的最大深度與最小深度(遞歸解)

目錄104. 二叉樹的最大深度559. N叉樹的最大深度111. 二叉樹的最小深度之前的筆記中&#xff0c;已經用層序遍歷解決過這個問題了現在試著用深度的解法去求解104. 二叉樹的最大深度 給定一個二叉樹&#xff0c;找出其最大深度。 二叉樹的深度為根節點到最遠葉子節點的最長路徑…

十、模板匹配

一、概念 模板匹配就是在整個圖像區域發現與給定子圖像匹配的小塊區域。 需要首先給定一個模板圖像A&#xff0c;和一個待檢測圖像B。 在待檢測圖像B上&#xff0c;從左往右&#xff0c;從上往下計算待檢測圖像B和模板圖像A所重疊的匹配度&#xff0c;匹配度越高則兩者相同的可…

基于WF的意見征集4(淺析)

接口項目&#xff1a;IClass&#xff08;項目名稱&#xff09; HTHuiFuusing System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Workflow.Runtime;using System.Workflow.Activities;namespace IClass{ /// <summary> /…

那些VisualStudio隱藏的調試功能

VisualStudio是一個強大的調試工具&#xff0c;里面很多隱藏功能少有人問津&#xff0c;但是在特定場景可以節省你很多時間&#xff0c;本文主要介紹一些VisualStudio調試相關的隱藏功能&#xff0c;歡迎大家補充。 運行到指針(Run to cursor) 大多數人用Visual Studio在調試程…