代码随想录 第十六天 二叉树操作(反转,对称)

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;
}

相关代码思想注释都在上面

翻转二叉树结果如下:

 对称二叉树结果如下:

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值