演算法學習記錄十四(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;
}
}
}
};
相關文章
- 演算法學習記錄四(C++)--->通過前序和中序序列重建二叉樹演算法C++二叉樹
- 劍指offer——二叉樹的映象C++二叉樹C++
- 二叉樹學習筆記二叉樹筆記
- 二叉樹的映象二叉樹
- 演算法學習記錄十三(C++)--->10年微軟面試題樹的子結構演算法C++微軟面試題
- c++學習記錄C++
- 學習筆記——二叉平衡樹(BST)筆記
- C++學習記錄1C++
- 二叉樹 學習二叉樹
- 資料結構學習(c++)——二叉樹 (轉)資料結構C++二叉樹
- 27. 二叉樹的映象二叉樹
- 演算法學習記錄二(C++)--->字串空格替換演算法C++字串
- PHP 第十四周函式學習記錄PHP函式
- 演算法學習記錄十(C++)--->數值的整數次方演算法C++
- 資料結構學習(C++)——二叉樹【2】 (轉)資料結構C++二叉樹
- 資料結構學習(C++)——二叉樹【3】 (轉)資料結構C++二叉樹
- 資料結構學習(C++)——二叉樹【1】 (轉)資料結構C++二叉樹
- NC72—二叉樹的映象二叉樹
- 深入學習二叉樹 (一) 二叉樹基礎二叉樹
- BAT 經典演算法筆試題: 映象二叉樹BAT演算法筆試二叉樹
- day 1 c++小白學習記錄C++
- 程式碼隨想錄演算法訓練營第十四天 | 二叉樹遍歷演算法二叉樹
- 演算法學習記錄十二(C++)--->連結串列題目集合演算法C++
- 演算法學習記錄一(C++)--->二維陣列中的查詢演算法C++陣列
- 程式碼隨想錄演算法 - 二叉樹演算法二叉樹
- 「程式碼隨想錄演算法訓練營」第十四天 | 二叉樹 part4演算法二叉樹
- C++樹——遍歷二叉樹C++二叉樹
- 《演算法圖解》學習記錄演算法圖解
- 演算法學習記錄五(C++)--->兩個棧實現佇列演算法C++佇列
- 演算法學習記錄九(C++)--->二進位制中1的個數演算法C++
- C/C++ 二叉樹C++二叉樹
- 演算法學習筆記(18):珂朵莉樹演算法筆記
- JZ-018-二叉樹的映象二叉樹
- 【劍指offer】27. 二叉樹的映象二叉樹
- 直接插入演算法的學習記錄演算法
- 資料結構二叉樹學習資料結構二叉樹
- 【每日學習記錄】使用錄影裝置記錄每天的學習
- 二叉樹的子樹和子結構 c++二叉樹C++