226. 翻转二叉树(力扣刷题代码随想录刷题)

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。

 

226. 翻转二叉树(力扣刷题代码随想录刷题)_第1张图片

思路: 

  1. 确定递归函数的参数和返回值

        参数就是要传入节点的指针,不需要其他参数了,通常此时定下来主要参数,如果在写递归的逻辑中发现还需要其他参数的时候,随时补充。

        返回值的话其实也不需要,但是题目中给出的要返回root节点的指针,可以直接使用题目定义好的函数,所以就函数的返回类型为TreeNode*

TreeNode* invertTree(TreeNode* root)

     2.确定终止条件

        当前节点为空的时候,就返回

if (root == NULL) return root;

    3.确定单层递归的逻辑

swap(root->left, root->right);
invertTree(root->left);
invertTree(root->right);

        代码如下:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */

 //递归
// class Solution {
// public:
//     TreeNode* invertTree(TreeNode* root) {
//         if(root == NULL) return root;

//         swap(root->left,root->right);
//         invertTree(root->left);
//         invertTree(root->right);
//         return root;
//     }
// };

//非递归
class Solution {
public:
    TreeNode* invertTree(TreeNode* root) {
        if (root == NULL) return root;
        stack st;
        st.push(root);
        while(!st.empty()) {
            TreeNode* node = st.top();              // 中0
            st.pop();
            swap(node->left, node->right);
            if(node->right) st.push(node->right);   // 右
            if(node->left) st.push(node->left);     // 左
        }
        return root;
    }
};






你可能感兴趣的:(leetcode刷题,leetcode,算法,c++)