leetcode-代码随想录-二叉树-226翻转二叉树
·
题目
链接:226-翻转二叉树
给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。

输入:root = [4,2,7,1,3,6,9]
输出:[4,7,2,9,6,3,1]
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
}
};
解题思路
递归 - 前序 / 后序
递归 - 前序
递归三部曲:
- 确定参数及返回值:
TreeNode* invertTree(TreeNode* root) - 确定终止条件:
if(root == NULL) return root; - 确定单层递归逻辑:
swap(root->left, root->right)
invertTree(root->left);
invertTree(root->right);

完整代码:
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
class Solution {
public:
TreeNode* invertTree(TreeNode* root){
if(root == nullptr) return root;
swap(root->left, root->right);
invertTree(root->left);
invertTree(root->right);
return root;
}
};
void printTree(TreeNode* root){
if(root == nullptr){
cout << "empty tree" << endl;
return;
}
queue<TreeNode*>que;
que.push(root);
while(!que.empty()){
int size = que.size();
for(int i = 0; i < size; i++){
TreeNode* node = que.front();
que.pop();
cout << node->val << " ";
if(node->left) que.push(node->left);
if(node->right) que.push(node->right);
}
// cout << endl; 若需要显示不同的层,就加上该句,若不需要就不加
}
}
int main(){
TreeNode* root = new TreeNode(4);
root->left = new TreeNode(2);
root->right = new TreeNode(7);
root->left->left = new TreeNode(1);
root->left->right = new TreeNode(3);
root->right->left = new TreeNode(6);
root->right->right = new TreeNode(9);
Solution obj;
TreeNode* res = obj.invertTree(root);
printTree(res);
return 0;
}
递归 - 后序
class Solution {
public:
TreeNode* invertTree(TreeNode* root){
if(root == nullptr) return root;
invertTree(root->left);
invertTree(root->right);
swap(root->left, root->right);
return root;
}
};

递归 - 中序 是不行的
在递归法中,是不能使用中序遍历的,会使得某些节点的右孩子翻转两次。

迭代法
该代码实现的是前序遍历:
class Solution {
public:
TreeNode* invertTree(TreeNode* root){
if(root == nullptr) return root;
stack<TreeNode*> st;
st.push(root);
while(!st.empty()){
TreeNode* node = st.top();
st.pop();
swap(node->left, node->right);
if(node->right) st.push(node->right);
if(node->left) st.push(node->left);
}
return root;
}
};
层序遍历
class Solution {
public:
TreeNode* invertTree(TreeNode* root){
queue<TreeNode*> que;
if(root != nullptr) que.push(root);
while(!que.empty()){
int size = que.size();
for(int i = 0; i < size; i++){
TreeNode* node = que.front();
que.pop();
swap(node->left, node->right);
if(node->left) que.push(node->left);
if(node->right) que.push(node->right);
}
}
return root;
}
};
总结
从终端输入数组,层序遍历构建二叉树
#include <iostream>
#include <queue>
#include <vector>
#include <string>
#include <sstream>
using namespace std;
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
TreeNode* buildTree(vector<int>& vec){
if(vec.empty() || vec[0] == -1) return nullptr;
queue<TreeNode*>que;
TreeNode* root = new TreeNode(vec[0]);
que.push(root);
int i = 1;
int n = vec.size();
while(!que.empty() && i < n){
TreeNode* node = que.front();
que.pop();
if(vec[i] != -1){
node->left = new TreeNode(vec[i]);
que.push(node->left);
}
i++;
if(i >= n) break; // 提前终止
if(vec[i] != -1){
node->right = new TreeNode(vec[i]);
que.push(node->right);
}
i++;
}
return root;
}
int main(){
cout << "输入节点:";
string input;
getline(cin, input);
vector<int> vec;
istringstream iss(input);
int num;
while(iss >> num){
vec.push_back(num);
}
TreeNode* root = buildTree(vec);
return 0;
}
层序遍历打印输出二叉树
void printTree(TreeNode* root){
if(root == nullptr){
cout << "empty tree" << endl;
return;
}
queue<TreeNode*>que;
que.push(root);
while(!que.empty()){
int size = que.size();
for(int i = 0; i < size; i++){
TreeNode* node = que.front();
que.pop();
cout << node->val << " ";
if(node->left) que.push(node->left);
if(node->right) que.push(node->right);
}
// cout << endl; 若需要显示不同的层,就加上该句,若不需要就不加
}
}
更多推荐


所有评论(0)