leetcode-master/problems/0226.翻转二叉树.md

3.8 KiB
Raw Blame History

题目地址

https://leetcode-cn.com/problems/invert-binary-tree/

思路

递归法

写递归算法的时候,要想一想是采用前中后序哪种遍历方式 o 如果对递归还不熟,可以看这里彻底吃透二叉树的前中后序递归法和迭代法!!

我们先看看递归算法,对于二叉树的递归方式有三种前中后序,先来看看前序遍历。

通过动画来看一下翻转的过程:

递归三部曲:

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

参数就是要传入节点的指针不需要其他参数了返回值的话其实也不需要但是题目中给出的要返回root节点的指针可以直接使用题目定义好的函数所以就返回一个指针。

TreeNode* invertTree(TreeNode* root)
  1. 确定终止条件

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

if (root == NULL) return root;
  1. 确定单层递归的逻辑

因为是先序遍历,所以先进行交换左右孩子节点,然后反转左子树,反转右子树。

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

基于这递归三步法代码基本写完C++代码如下:

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

迭代法

leetcode-master 中给出了 前中后序迭代法统一的模板,使用前序遍历,只需要改动一行就可以了,代码在下面已经给出。

C++代码

递归(前序遍历)

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<TreeNode*> st;
        st.push(root);
        while(!st.empty()) {
            TreeNode* node = st.top();
            st.pop();
            swap(node->left, node->right);
            if(node->left) st.push(node->left);
            if(node->right) st.push(node->right);
        }
        return root;
    }
};

迭代法(前序遍历)(模板)

模板地址:leetcode-master

class Solution {
public:
    TreeNode* invertTree(TreeNode* root) {
        stack<TreeNode*> st;
        if (root != NULL) st.push(root);
        while (!st.empty()) {
            TreeNode* node = st.top();
            if (node != NULL) {
                st.pop();
                if (node->right) st.push(node->right);  // 添加右节点
                if (node->left) st.push(node->left);    // 添加左节点
                st.push(node);                          // 添加中节点
                st.push(NULL);
            } else {
                st.pop();
                node = st.top();
                st.pop();
                swap(node->left, node->right);          // 节点处理逻辑
            }
        }
        return root;
    }
};

更多算法干货文章持续更新可以微信搜索「代码随想录」第一时间围观关注后回复「Java」「C++」 「python」「简历模板」「数据结构与算法」等等就可以获得我多年整理的学习资料。