演算法學習記錄十四(C++)--->二叉樹的映象
描述
操作給定的二叉樹,將其變換為源二叉樹的映象。
分析
我們只需要遍歷二叉樹,然後每次訪問(輸出)一個節點的時候。交換其左右孩子即可
有遞迴和非遞迴兩個版本
其本質是相同的,就是把前序中序,後序遍歷中的列印節點的過程,程式設計交換左右子樹的過程,其中需要注意一點,就是交換後左右子樹進行了交換,再往下走的時候,往左走往右走的過程需改變,原來的向右走,現在應該是向左走
遞迴版本
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
// 遞迴
class Solution {
public:
void Mirror(TreeNode *pRoot) {
if(pRoot == NULL){
return;
}
swap(pRoot->left,pRoot->right);
Mirror(pRoot->left);
Mirror(pRoot->right);
}
};
非遞迴版本(前序)
// 前序 前序遍歷的過程中,先根,再左再右,
// 由於根後面才對左右子樹進行訪問,因此訪問順序可不交換,我們此時的訪問順序依舊是根左右,但是對應原來的根右左
class Solution {
public:
void Mirror(TreeNode *pRoot) {
if(pRoot == NULL){
return;
}
// 棧
stack<TreeNode *> nStack;
// 壓根節點入棧
nStack.push(pRoot);
// 根節點
TreeNode *node = pRoot;
// 一開始棧裡面有根節點 不為空
while(nStack.empty() != true){
// 獲取棧頂元素
node = nStack.top();
nStack.pop();
// 交換
if(node->left != NULL || node->right != NULL){
swap(node->left,node->right);
}
// 遞迴左子樹
if(node->left != NULL){
nStack.push(node->left);
}
// 遞迴右子樹
if(node->right != NULL){
nStack.push(node->right);
}
}
}
};
非遞迴版本(中序)
class Solution {
public:
// 中序 中序遍歷的時候,訪問順序左根右,由於訪問後,依然要向右走,
// 所以交換後,變成了向左走 也就是最後一段程式碼的體現
void Mirror(TreeNode *pRoot) {
if(pRoot == NULL){
return;
}
// 棧
stack<TreeNode *> nStack;
// 根節點
TreeNode *node = pRoot;
// 節點空 而且 棧為空 結束迴圈
while(node != NULL || nStack.empty() != true){
// 二叉樹左側所有節點入棧 例如第一次是 865
while(node != NULL){
nStack.push(node);
node = node->left;
}
// 865一個個出棧
while(nStack.empty() != true){
node = nStack.top();
// 出棧的過程中進行交換左右
if(node->left != NULL || node->right != NULL){
swap(node->left,node->right);
}
nStack.pop();
// 最關鍵的一句 由於左側所有節點已經左右交換完畢,因此你不會再去獲取node->right,不然你操作的又是剛才的節點
// 應該繼續node->left的左子樹進行下一輪
node = node->left;
}
}
}
};
相關文章
- 劍指offer——二叉樹的映象C++二叉樹C++
- 二叉樹學習筆記二叉樹筆記
- c++學習記錄C++
- 二叉樹的映象二叉樹
- C++學習記錄1C++
- 學習筆記——二叉平衡樹(BST)筆記
- 二叉樹 學習二叉樹
- 27. 二叉樹的映象二叉樹
- PHP 第十四周函式學習記錄PHP函式
- day 1 c++小白學習記錄C++
- JZ-018-二叉樹的映象二叉樹
- NC72—二叉樹的映象二叉樹
- BAT 經典演算法筆試題: 映象二叉樹BAT演算法筆試二叉樹
- 程式碼隨想錄演算法訓練營第十四天 | 二叉樹遍歷演算法二叉樹
- 深入學習二叉樹 (一) 二叉樹基礎二叉樹
- 程式碼隨想錄演算法 - 二叉樹演算法二叉樹
- 「程式碼隨想錄演算法訓練營」第十四天 | 二叉樹 part4演算法二叉樹
- C++樹——遍歷二叉樹C++二叉樹
- 《演算法圖解》學習記錄演算法圖解
- 程式碼隨想錄演算法訓練營第十四天|leetcode226. 翻轉二叉樹、leetcode101.對稱二叉樹、leetcode104.二叉樹的最大深度、leetcode111.二叉樹的最小深度演算法LeetCode二叉樹
- 程式碼隨想錄演算法訓練營第十四天| 226.翻轉二叉樹 、101. 對稱二叉樹、104.二叉樹的最大深度 (優先掌握遞迴)、111.二叉樹的最小深度演算法二叉樹遞迴
- C/C++ 二叉樹C++二叉樹
- 【劍指offer】27. 二叉樹的映象二叉樹
- 直接插入演算法的學習記錄演算法
- 【每日學習記錄】使用錄影裝置記錄每天的學習
- 演算法學習筆記(18):珂朵莉樹演算法筆記
- 普通平衡樹學習筆記之Splay演算法筆記演算法
- 【演算法學習筆記】生成樹問題探究演算法筆記
- 演算法-二叉樹演算法二叉樹
- 資料結構二叉樹學習資料結構二叉樹
- 《演算法筆記》7. 二叉樹基本演算法整理演算法筆記二叉樹
- 演算法學習---歸併演算法簡單記錄演算法
- 劍指offer——二叉樹的深度C++二叉樹C++
- docker學習筆記(3)- 映象Docker筆記
- 演算法學習筆記1語法 (C++組)演算法筆記C++
- 學習記錄
- 【劍指offer】5.二叉樹的映象和列印二叉樹
- 力扣 - 劍指 Offer 27. 二叉樹的映象力扣二叉樹
- docker學習(常用命令,映象燒錄,定製映象)Docker