面接問題27:ツリーのミラーリング(C++)
5648 ワード
タイトルアドレス:https://leetcode-cn.com/problems/er-cha-shu-de-jing-xiang-lcof/
タイトルの説明
関数を完了し、ミラーを出力するツリーを入力してください.
たとえば、次のように入力します.
4/2 7//1 3 6 9ミラー出力:
4 / \ 7 2 /\ /\9 6 3 1
タイトルの例
例1:
問題を解く構想.
DFS:シーケンシャルループ実装
(1)再帰方法:二叉探索木に関わる限り,いずれも再帰的に解決することができ,問題を分析すると,二叉木のミラーリングは左右のサブツリーのノードを交換することによって変換されたものであり,我々は二叉木の先序遍歴特徴を利用して再帰的に実現し,主にサブツリーの左右のノードを交換する.
(2)スタック方法:二叉木の先序遍歴方法は二つあり、一つは再帰方法であり、もう一つは非再帰方法である.すなわちスタック実現である.ここではスタックの方法を用いて解決する.具体的な構想はルートノードをスタックに押し込み、その後スタックトップ要素の左右のサブツリーを交換し、交換後の左右のノードをスタックの左ノードと右ノードにそれぞれ押し込む.スタックが空でない場合に戻ります.
BFS:階層遍歴実装
≪キュー・メソッド|Queue Method|emdw≫:キューのメソッドを使用して、1つ1つを遍歴し、キューの最初の要素の左右のサブツリーを交換します.
プログラムソース
再帰
スタック(非再帰)
キュー
タイトルの説明
関数を完了し、ミラーを出力するツリーを入力してください.
たとえば、次のように入力します.
4/2 7//1 3 6 9ミラー出力:
4 / \ 7 2 /\ /\9 6 3 1
タイトルの例
例1:
:root = [4,2,7,1,3,6,9]
:[4,7,2,9,6,3,1]
問題を解く構想.
DFS:シーケンシャルループ実装
(1)再帰方法:二叉探索木に関わる限り,いずれも再帰的に解決することができ,問題を分析すると,二叉木のミラーリングは左右のサブツリーのノードを交換することによって変換されたものであり,我々は二叉木の先序遍歴特徴を利用して再帰的に実現し,主にサブツリーの左右のノードを交換する.
(2)スタック方法:二叉木の先序遍歴方法は二つあり、一つは再帰方法であり、もう一つは非再帰方法である.すなわちスタック実現である.ここではスタックの方法を用いて解決する.具体的な構想はルートノードをスタックに押し込み、その後スタックトップ要素の左右のサブツリーを交換し、交換後の左右のノードをスタックの左ノードと右ノードにそれぞれ押し込む.スタックが空でない場合に戻ります.
BFS:階層遍歴実装
≪キュー・メソッド|Queue Method|emdw≫:キューのメソッドを使用して、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* mirrorTree(TreeNode* root) {
if(root == nullptr) return nullptr;
TreeNode* p = root->left;
root->left = mirrorTree(root->right);
root->right = mirrorTree(p);
/*
if(root == nullptr) return nullptr;
swap(root->left, root->right);
mirrorTree(root->left);
mirrorTree(root->right);
return root;
*/
return root;
}
};
スタック(非再帰)
/**
* 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* mirrorTree(TreeNode* root) {
if(root == nullptr) return nullptr;
stack s;
s.push(root);
while(!s.empty())
{
TreeNode* p = s.top();
s.pop();
if(p == nullptr) continue;
TreeNode* q = p->left;
p->left = p->right;
p->right = q;
s.push(p->left);
s.push(p->right);
}
return root;
}
};
キュー
/**
* 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* mirrorTree(TreeNode* root) {
if(root == nullptr) return nullptr;
queue que;
que.push(root);
while(!que.empty())
{
TreeNode* p = que.front();
que.pop();
if(p == nullptr) continue;
TreeNode* q = p->left;
p->left = p->right;
p->right = q;
que.push(p->left);
que.push(p->right);
}
return root;
}
};