【剑指offer】二叉树镜像(递归与非递归)

题目

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

  • 如下图所示:右边的二叉树就是左边的树的镜像。我们可以根据照镜子的经验画出它的镜像。
    这里写图片描述

递归:


递归思想:这两棵树的根节点相同,但是他们的左右孩子交换了。首先,我们交换根节点的两个孩子,然后递归的处理根节点孩子的孩子。代码如下:


void mirror(BinaryTreeNode *root)
{
    if(root == NULL)//处理的当前节点为空
        return;
    if(root->left == NULL && root->right == NULL)//处理叶子节点
        return;

    swap(root->left,root->right);//交换左右孩子

    if(root->left != NULL)//进入左孩子
        mirror(root->left);
    if(root->right != NULL)//进入右孩子
        mirror(root->right);
}

非递归:


非递归思想一:我们按照广度遍历二叉树的顺序,逐个处理遍历的节点。当处理的当前节点,如果有孩子节点,我们交换它们的孩子节点,并且把它们的非空孩子入队列。处理完当前节点以后,我们下一次处理队头的节点。


void mirror_OP1(BinaryTreeNode *root)
{
    if (root == NULL)//如果处理的空树,我们直接返回
            return;
    queue<BinaryTreeNode *> q;
    BinaryTreeNode *pointer = root;//当前处理的节点为根节点
    while (pointer)
    {

        if (pointer->left != NULL || pointer->right != NULL)//非叶子节点
            {
                swap(pointer->left,pointer->right);//交换其左右孩子
            }

        if (pointer->left)//左孩子不为空
            q.push(pointer->left);
        if (pointer->right)//右孩子不为空
            q.push(pointer->right);

        if (!q.empty())
        {
            pointer = q.front();
            q.pop();
        }
        else
        {
            break;
        }
    }
}

非递归思想二:我们也可以按照先序遍历二叉树的顺序,非递归的实现二叉树的镜像操作,每遇到一个节点,判断当前节点是否有孩子,如果有孩子,我们交换其左右孩子,然后把非空孩子入栈。直到栈为空。


    void mirror_OP2(BinaryTreeNode *root)
    {
        if (root == NULL)//如果处理的空树,我们直接返回
            return;
        stack<BinaryTreeNode*> s;//创建一个栈
        s.push(root);
        BinaryTreeNode *pointer = NULL;
        while (!s.empty())
        {
            pointer = s.top();//取出栈顶元素
            s.pop();
            if (pointer->left != NULL || pointer->right != NULL)//非叶子节点
            {
                swap(pointer->left,pointer->right);//交换其左右孩子
            }
            if (pointer->left != NULL)//非空左子树入栈
                s.push(pointer->left);
            if (pointer->right != NULL)//非空右子树入栈
                s.push(pointer->right);
        }
    }

结语

程序猿需要更多的是修bug的耐心与执着!

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 博客之星2020 设计师:CY__ 返回首页