力扣 226 翻转二叉树 【递归三步法】

力扣 226 翻转二叉树

全部刷题与学习记录

【C++刷题学习笔记目录】

【C++百万并发网络通信-笔记目录】

原题目

题目地址:226. 翻转二叉树

翻转一棵二叉树。

示例:

输入:

     4
   /   \
  2     7
 / \   / \
1   3 6   9

输出:

     4
   /   \
  7     2
 / \   / \
9   6 3   1

注:这道题与 剑指 27 二叉树的镜像 是一样的,但是我们这次采用递归三步法来考虑问题


考查知识点

递归三步法


自己的第一遍解法

首先分析题目,其实每一个二叉树的问题都可以在基础的(一个父节点,两个子节点)上拓展出来,题目给我们宏观上的要求,我们要做的就是在二叉树的微观上做文章。

宏观:翻转二叉树

微观:将父节点的两个子节点交换位置

从微观再扩展一下,其实就是遍历树中每一个父节点,将它的两个子节点交换一下位置就行了

使用递归三步法:

1、确定递归函数的返回值与参数: 在递归访问每一个节点的过程中,只需要交换子节点次序,其实不需要返回什么东西,返回值为void

2、确定递归终止条件: 每次遇到叶节点后就结束本层递归,退回到父节点,因为叶节点没有子节点需要交换位置

3、确定单层递归的逻辑: 交换左右子节点

来看代码,因为二叉树没法直接输出树形结构,只能以深度优先(前中后 序遍历)或者广度优先(层序遍历)来查看修改以后的二叉树符不符合题目要求,所以写了一个前序遍历的查看函数visit()进行测试

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 == nullptr)    return nullptr;

        travesal(root);
        return root;
    }

    void travesal(TreeNode* node) {
    
    //返回值及参数
        if (node == nullptr)    return;//退出条件
		//单层逻辑
        TreeNode* tmp;
        tmp = node->left;
        node->left = node->right;
        node->right = tmp;
        travesal(node->left);
        travesal(node->right);
    }
};

void visit(TreeNode* node) {
    
    
    if (node != nullptr){
    
    
        cout << node->val << " " ;
        visit(node->left);
        visit(node->right);
    }
    else return;
}

int main() {
    
    
    TreeNode x4(4), x2(2), x7(7), x1(1), x3(3), x6(6), x9(9);
    x4.left = &x2;
    x4.right = &x7;
    x2.left = &x1;
    x2.right = &x3;
    x7.left = &x6;
    x7.right = &x9;

    Solution so;
    TreeNode* res = so.invertTree(&x4);
    visit(res);

}

猜你喜欢

转载自blog.csdn.net/weixin_44484715/article/details/114948973
今日推荐