非递归写法

二叉树的镜像

http://www.nowcoder.com/questionTerminal/564f4c26aa584921bc75623e48ca3011

好像没见到详细的非递归,正好看了别人的代码有点启发,就自己写下来了

首先看一下镜像过程:
图片说明

思路:
当处理新的一层时,依次(从左至右)取得每个结点,并交换他们的左右子结点,因为是从第一层开始往下的,所以只需要在每次处理一层时依次把每一个结点的左右子结点交换一下,就会在处理完整棵树时,所有结点都交换了一遍

代码:

class Solution {
public:
    void Mirror(TreeNode *pRoot) 
    {
        //传入头结点为空直接返回
        if(!pRoot) return ;
        queue<TreeNode *> que;
        //在while操作之前把头结点加入队列,否则队列为空直接结束
        que.push(pRoot);

        while(!que.empty())
        {
            //获取每一层的结点数,即会对这一层的queSize个结点都执行交换操作
            int queSize = que.size();
            //处理完一个结点后,计数-1
            while(queSize--)
            {
                //取得当前队列第一个元素(并非出队)
                TreeNode *temp = que.front();
                //出队
                que.pop();

                //先交换,再把其左右结点入队
                //定义临时的TreeNode类型指针,用于交换左右结点
                TreeNode *swap;
                swap = temp->left;
                temp->left = temp->right;
                temp->right = swap;

                //如果左(或右)结点不为空,就加入队列
                if(temp->left) {que.push(temp->left);}
                if(temp->right) {que.push(temp->right);}
            }//继续对这一层的下一个结点进行操作
        }//队列不空时,获取下一层结点的个数,并会执行相应次数的交换与入队操作
    }
};
全部评论

相关推荐

01-04 07:53
门头沟学院 C++
心愿便利贴:工作了以后回头再看待这个问题,从客观的视角来讲是因为每个人对自己的要求不同,学习好的人对自己的要求很高,所以觉得考不好就天塌了,认为自己学习好并且值得一份好工作的人也是一样,找不到符合自己预期的工作肯定也会觉得是侮辱,牛客上有很多名校大学生,肯定会存在这种好学生心态啊,“做题区”从来都不是贬义词,这是大部分普通人赖以生存的路径,这个有什么好嘲讽的,有“好学生心态”没有错,但是不要给自己太大的压力了
点赞 评论 收藏
分享
评论
4
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务