226.翻转二叉树
翻转一棵二叉树。
101.对称二叉树
给定一个二叉树,检查它是否是镜像对称的。
代码如下:
// 对称二叉树 反转二叉树.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include<stack>
#include<vector>
#include<utility>
using namespace std;
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int val) :val(val),left(nullptr),right(nullptr) {}
};
class SolutionInverse {
public:
TreeNode* inverseTree(TreeNode*& root) {
if (root == nullptr) return root;//如果
swap(root->left, root->right);
if (root->left != nullptr) inverseTree(root->left);
if (root->right != nullptr) inverseTree(root->right);
return root;
}
};
//对称二叉树
class SolutionSympticTree {
public:
bool isSymmetric(TreeNode* root) {
if (root->left == NULL && root->right != NULL)return false;
else if (root->left != NULL && root->right == NULL)return false;
else if (root->left == NULL && root->right == NULL)return true;
else if (root->left->val != root->right->val) {
return false;
}
else if(root->left->val == root->right->val){
isSymmetric(root->left);
isSymmetric(root->right);
}
else return true;
}
};
//遍历输出二叉树元素
class SolutionCoutElement {
public:
void LMF(TreeNode* cur, vector<int>&vec) {//定义一个vector容器,用来接收遍历输出的元素
if (cur == nullptr) {
return;
}
//cout << cur->val<<" ";
vec.push_back(cur->val);
LMF(cur->left, vec);
LMF(cur->right, vec);
}
vector<int>Ergonic(TreeNode* tree) {
vector<int>result;
LMF(tree, result);
return result;
}
};
//用数组初始化二叉树
TreeNode* buildTree(vector<int>& nums) {
int n = nums.size();
if (n < 1) return nullptr;
vector<TreeNode*> nodes(n); // 用vector存储所有节点
// 初始化所有节点
for (int i = 0; i < n; i++) {
if (nums[i] != NULL) {
nodes[i] = new TreeNode(nums[i]);
}
}
// 为每个节点指定左右子节点的位置
int leftIndex = 1;
int rightIndex = 2;
for (int i = 0; i < n; i++) {
if (nodes[i] == nullptr) continue;
if (leftIndex < n && nodes[leftIndex] != nullptr) {
nodes[i]->left = nodes[leftIndex];
}
if (rightIndex < n && nodes[rightIndex] != nullptr) {
nodes[i]->right = nodes[rightIndex];
}
leftIndex += 2;
rightIndex += 2;
//cout << nodes[i]->val<<" 我爱我";
}
return nodes[0]; // 返回根节点指针
}
//主函数
int main()
{
vector<int>num = { 1,2,3,4,5,6,7,8,9,11,12 };
TreeNode*tree= buildTree(num);
SolutionCoutElement s;
SolutionSympticTree sinverse;
SolutionInverse sInverse;
//bool oneorzero = sinverse.isSymmetric(tree);
TreeNode*tree1= sInverse.inverseTree(tree);
vector<int>vec = s.Ergonic(tree1);
// cout << boolalpha << oneorzero;
for (auto val : vec) {
cout << val << " ";
}
return 0;
}
相关代码思想注释都在上面
翻转二叉树结果如下:
对称二叉树结果如下: