剑指offer——面试题19:二叉树的镜像
来源:互联网 发布:网络电视 直播软件 编辑:程序博客网 时间:2024/06/10 13:36
题目:操作给定的二叉树,将其变换为源二叉树的镜像。
二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9 7 5
代码1:递归方法
/*struct TreeNode {int val;struct TreeNode *left;struct TreeNode *right;TreeNode(int x) :val(x), left(NULL), right(NULL) {}};*/class Solution {public: void Mirror(TreeNode *pRoot) { if(pRoot == NULL) // 对于函数返回值为空的,当根结点为空时,直接 return return; // if(pRoot->left == NULL||pRoot->right == NULL) if(pRoot->left == NULL&&pRoot->right == NULL) // 左右子树都为空的情况 return; TreeNode *pTemp = pRoot->left; pRoot->left = pRoot->right; pRoot->right = pTemp; if(pRoot->left) Mirror(pRoot->left); if(pRoot->right) Mirror(pRoot->right); }
分析:先序遍历这棵树,如果遍历到的结点有子节点,就交换它的子结点。当交换完所有的非叶子结点的左右子结点以后,就得到了树的镜像。
代码2:非递归方法(vector + swap())
void Mirror(TreeNode *pRoot) { if (!pRoot) return; vector<TreeNode*> vv; vv.push_back(pRoot); while (!vv.empty()) { vector<TreeNode*> t; for (auto &i : vv) { swap(i->left, i->right); if (i->left) t.push_back(i->left); if (i->right) t.push_back(i->right); } vv.swap(t); } }
分析:比较好理解,不赘述了。
代码3:非递归方法(队列)
void Mirror(TreeNode *pRoot) { queue<TreeNode *> q; TreeNode *pointer = pRoot;//当前处理的节点为根节点 while (pointer) { 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; } } }
分析:我们按照广度遍历二叉树的顺序,逐个处理遍历的节点。当处理的当前节点,如果有孩子节点,我们交换它们的孩子节点,并且把它们的非空孩子入队列。处理完当前节点以后,我们下一次处理队头的节点。
代码4:非递归方法(栈)
void Mirror(TreeNode *pRoot) { if (pRoot == NULL)//如果处理的空树,我们直接返回 return; stack<TreeNode*> s;//创建一个栈 s.push(pRoot); TreeNode *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); } }
分析:我们也可以按照先序遍历二叉树的顺序,非递归的实现二叉树的镜像操作,每遇到一个节点,判断当前节点是否有孩子,如果有孩子,我们交换其左右孩子,然后把非空孩子入栈。直到队列为空。
阅读全文
2 0
- [剑指offer][面试题19]二叉树的镜像
- 【剑指offer】面试题19:二叉树的镜像
- 剑指offer 面试题19 二叉树的镜像
- 剑指Offer:面试题19 二叉树的镜像
- 《剑指Offer》面试题19:二叉树的镜像
- 剑指offer-面试题19:二叉树的镜像
- 剑指Offer----面试题19:二叉树的镜像
- 剑指offer面试题19:二叉树的镜像
- 剑指offer面试题19:二叉树的镜像
- 剑指offer面试题19:二叉树的镜像
- 剑指offer--面试题19:二叉树的镜像
- 剑指offer-面试题19-二叉树的镜像
- 【剑指offer】面试题19:二叉树的镜像
- 【面试题】剑指Offer-19-二叉树的镜像
- 剑指offer-面试题19-二叉树的镜像
- 剑指offer-面试题 19:二叉树的镜像
- 剑指offer 面试题19 二叉树的镜像
- 【剑指offer】面试题19:二叉树的镜像
- 区块链是如何做到交易数据防篡改的
- es6新特性
- 记区域赛
- 广度优先搜索(BFS)分分钟让你学会BFS!!!
- 2017117每日一练
- 剑指offer——面试题19:二叉树的镜像
- 添加MATLAB工具箱
- Netty系列之Netty高性能之道
- P2P:区块链系统的重要基石
- 2017NOIP模拟赛 松鼠的新家(树上差分)
- Bellman_Ford的负环
- vsftpd服务的各项参数
- Springmvc和mybatis整合
- 使用Namp时的基本思路