欢迎访问宙启技术站
智能推送

剑指offer:二叉树的镜像

发布时间:2023-05-14 14:05:49

题目描述:

请完成一个函数,输入一个二叉树,该函数输出它的镜像。

例如:

输入二叉树:

        8

      /   \

     6     10

    / \   /  \

   5   7 9   11

输出二叉树:

         8

       /   \

     10     6

    / \   /  \

   11   9 7    5

思路分析:

通过画图可以看出,将一棵二叉树的左右子树进行交换,就是这棵二叉树的镜像。构建一个递归函数,将每个节点的左右子树都交换一下即可。

代码实现:

1.递归实现:

class Solution {

public:

    void Mirror(TreeNode *pRoot) {

        if(pRoot == nullptr)

            return;

        TreeNode* temp = pRoot->left;

        pRoot->left = pRoot->right;

        pRoot->right = temp;

        Mirror(pRoot->left);

        Mirror(pRoot->right);

    }

};

2.非递归实现:

class Solution {

public:

    void Mirror(TreeNode *pRoot) {

        if(pRoot == nullptr)

            return;

        stack<TreeNode*> s;

        s.push(pRoot);

        while(!s.empty()){

            TreeNode* temp = s.top();

            s.pop();

            if(temp->left != nullptr || temp->right != nullptr){

                TreeNode* t = temp->left;

                temp->left = temp->right;

                temp->right = t;

            }

            if(temp->left != nullptr)

                s.push(temp->left);

            if(temp->right != nullptr)

                s.push(temp->right);

        }

    }

};

总结:

1.本题采用递归和非递归两种方法实现,具体看自己的喜好。

2.注意判断空指针的情况,遍历左右子树时都要判断是否为空。

3.本题思路简单,关键是多加练习,不断熟悉二叉树的遍历。