二叉樹的映象
操作給定的二叉樹,將其變換為源二叉樹的映象。假設題目所給的二叉樹如下所示
解法一
思路很簡單,既然要求映象,只要將每一個結點的左右子結點交換一下位置就好了。使用中序遍歷可以幫助我們實現這一想法
public class Solution {
private TreeNode temp;
public void Mirror(TreeNode root) {
if(root == null) {
return;
}
temp = root.left;
root.left = root.right;
root.right = temp;
Mirror(root.left);
Mirror(root.right);
}
}
解法二
解法一雖然簡單粗暴,但如果碰到大資料就直接炸了。我們還是使用遞迴的思想,思考遞迴的時候不要一步步看它執行了啥,思考的方式應該是首先假設子問題都已經完美處理,然後只需要處理最終的問題即可。子問題的處理方式與最終那個處理方式一樣,但是問題規模一定要逐漸縮小,最後給一個遞迴出口條件即可
對於本題,首先假設 root 的左右子樹已經都處理好了,即左子樹自身已經映象了,右子樹自身也映象了,那麼最後一步就是交換左右子樹,問題解決。下面進入遞迴,就是處理子問題。子問題的處理方式與 root 一樣,只是要縮小問題規模,所以只需要考慮 root.left 是什麼情況,root.right 是什麼情況即可
public class Solution {
public void Mirror(TreeNode root) {
// 為空則結束
if(root == null) {
return;
}
// 假設 root 的左右子樹都已經完成映象了
// 那就讓左右子樹交換
swap(root);
// 左子樹做映象操作
Mirror(root.left);
// 右子樹做映象操作
Mirror(root.right);
}
private void swap(TreeNode node) {
TreeNode temp = null;
temp = node.left;
node.left = node.right;
node.right = temp;
}
}
當然,也可以使用棧來模擬上面的過程。開始執行方法時入棧,方法執行完畢時出棧
import java.util.Stack;
public class Solution {
private Stack<TreeNode> stack = new Stack<>();
public void Mirror(TreeNode root) {
if(root == null) {
return;
}
stack.push(root);
while(!stack.empty()) {
TreeNode node = stack.pop();
swap(node);
if(node.left != null) {
stack.push(node.left);
}
if(node.right != null) {
stack.push(node.right);
}
}
}
private void swap(TreeNode node) {
TreeNode temp = null;
temp = node.left;
node.left = node.right;
node.right = temp;
}
}
相關文章
- 27. 二叉樹的映象二叉樹
- NC72—二叉樹的映象二叉樹
- JZ-018-二叉樹的映象二叉樹
- 劍指offer——二叉樹的映象C++二叉樹C++
- 【劍指offer】27. 二叉樹的映象二叉樹
- 【劍指offer】5.二叉樹的映象和列印二叉樹
- 力扣 - 劍指 Offer 27. 二叉樹的映象力扣二叉樹
- [每日一題] 第二十五題:二叉樹的映象每日一題二叉樹
- 滿二叉樹、完全二叉樹、平衡二叉樹、二叉搜尋樹(二叉查詢樹)和最優二叉樹二叉樹
- 演算法學習記錄十四(C++)--->二叉樹的映象演算法C++二叉樹
- BAT 經典演算法筆試題: 映象二叉樹BAT演算法筆試二叉樹
- 二叉樹:構造二叉樹(通過前序和中序遍歷)、映象翻轉、層次遍歷二叉樹
- 二叉樹的應用(1)--二叉樹排序樹基本操作二叉樹排序
- 二叉樹 & 二叉查詢樹二叉樹
- 資料結構中的樹(二叉樹、二叉搜尋樹、AVL樹)資料結構二叉樹
- 刷題系列 - Python判斷是否映象對稱二叉樹Python二叉樹
- 排序二叉樹和平衡二叉樹排序二叉樹
- 二叉查詢樹(二叉排序樹)排序
- 二叉樹(順序儲存二叉樹,線索化二叉樹)二叉樹
- 樹(2)--二叉樹的遍歷(非遞迴)+線索二叉樹二叉樹遞迴
- 二叉樹的子結構、深度以及重建二叉樹二叉樹
- 二叉搜尋樹和二叉樹的最近公共祖先二叉樹
- 二叉樹的深度二叉樹
- 手擼二叉樹——二叉查詢樹二叉樹
- 手擼二叉樹——AVL平衡二叉樹二叉樹
- 資料結構之樹結構概述(含滿二叉樹、完全二叉樹、平衡二叉樹、二叉搜尋樹、紅黑樹、B-樹、B+樹、B*樹)資料結構二叉樹
- 樹(1)--樹和二叉樹的基本定義二叉樹
- 二叉樹二叉樹
- 玩轉二叉樹(樹的遍歷)二叉樹
- 平衡樹和二叉樹的區別二叉樹
- 判斷二叉樹是否為滿二叉樹二叉樹
- 對稱的二叉樹二叉樹
- 求二叉樹的高度二叉樹
- 二叉樹的遍歷二叉樹
- 灰哥的二叉樹二叉樹
- 二叉樹的基本操作二叉樹
- 二叉樹的種類二叉樹
- 二叉樹的性質二叉樹