Interview----将一棵二叉树转换成其镜像
题目:输入一颗二元查找树,将该树转换为它的镜像,
即在转换后的二元查找树中,左子树的结点都大于右子树的结点。
用递归和循环两种方法完成树的镜像转换。
例如输入:
8
/ \
6 10
/ \ / \
5 7 9 11
输出:
8
/ \
10 6
/ \ / \
11 9 7 5
分析:
1. 递归,类似与先序和后序遍历。
2. 迭代:可以采用先序,后序的迭代版本,或者采用层序遍历也可。
二叉树的遍历的非递归版本可参考 点击打开链接
// copyrigth @ L.J.SHOU Mar.09, 2014
// find the mirror of a binary tree
#include <iostream>
#include <stack>
#include <queue>
using namespace std; struct TreeNode{
int val;
TreeNode *left, *right;
TreeNode(int x)
:val(x), left(NULL), right(NULL){}
}; // recursive version
TreeNode* Mirror(TreeNode *root)
{
if(root == NULL)
return NULL; swap(root->left, root->right);
root->left = Mirror(root->left);
root->right = Mirror(root->right); return root;
} // iterative version 1
// pre-order traversal
TreeNode* MirrorIterative(TreeNode *root)
{
if(root == NULL) return NULL; TreeNode *p = root;
stack<TreeNode*> s;
while(p || !s.empty())
{
while(p){
swap(p->left, p->right);
s.push(p);
p = p->left;
}
p = s.top(); s.pop();
p = p->right;
}
return root;
} // iterative version 2
// level order traversal
TreeNode* MirrorLevelOrder(TreeNode *root)
{
if(root == NULL) return NULL; TreeNode *node(NULL);
queue<TreeNode *> cur, next;
cur.push(root); while(!cur.empty())
{
while(!cur.empty()){
node = cur.front(); cur.pop();
swap(node->left, node->right);
if(node->left)
next.push(node->left);
if(node->right)
next.push(node->right);
}
swap(cur, next);
}
return root;
} TreeNode* Destroy(TreeNode *root)
{
if(root == NULL) return NULL;
root->left = Destroy(root->left);
root->right = Destroy(root->right);
delete root;
return NULL;
} void InOrder(TreeNode *root)
{
stack<TreeNode*> s; while(root || !s.empty()){
while(root){
s.push(root);
root = root->left;
}
root = s.top(); s.pop();
cout << root->val << " ";
root = root->right;
}
cout << endl;
} int main(void)
{
TreeNode *root(NULL); root = new TreeNode(8);
root->left = new TreeNode(6);
root->right = new TreeNode(10);
root->left->left = new TreeNode(5);
root->left->right = new TreeNode(7);
root->right->left = new TreeNode(9);
root->right->right = new TreeNode(11); root = MirrorLevelOrder(root);
InOrder(root); root = Destroy(root);
return 0;
}
Interview----将一棵二叉树转换成其镜像的更多相关文章
- 二叉树转换成森林&森林变成二叉树
一,树转换成二叉树 1,将全部兄弟结点连起来; 2,保留第一个兄弟结点与父节点的连接,断开其它兄弟结点与父节点的连接,然后以根节点为轴依照顺时针方向旋转45度 watermark/2/text/aHR ...
- disk2vhd-----将windows系统转换成虚拟镜像格式
工具介绍 下载url:http://technet.microsoft.com/en-us/sysinternals/ee656415.aspx disk2vhd是一个非常小的P2V转换工具,可以将你 ...
- VirtualBox 原始镜像转换成 vdi 镜像
VBoxManage convertdd [-static] <filename> <outputfile> 将raw硬盘转换成vdi虚拟硬盘
- 【遍历二叉树】11把二叉树转换成前序遍历的链表【Flatten Binary Tree to Linked List】
本质上是二叉树的root->right->left遍历. +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ...
- leetcode 114二叉树转换成链表
解法一 可以发现展开的顺序其实就是二叉树的先序遍历.算法和 94 题中序遍历的 Morris 算法有些神似,我们需要两步完成这道题. 将左子树插入到右子树的地方 将原来的右子树接到左子树的最右边节点 ...
- Cracking-- 17.13 将二叉树转换成双向链表
在书的105页 使用中根遍历的思想 left 之后 为 root 之后 为 right 则对左子树来说 left->right = root; root->left = left; 对右子 ...
- lintcode 453 将二叉树拆成链表
将二叉树拆成链表 描述 笔记 数据 评测 将一棵二叉树按照前序遍历拆解成为一个假链表.所谓的假链表是说,用二叉树的 right 指针,来表示链表中的 next 指针. 注意事项 不要忘记将左儿子标 ...
- 【LeetCode-面试算法经典-Java实现】【109-Convert Sorted List to Binary Search Tree(排序链表转换成二叉排序树)】
[109-Convert Sorted List to Binary Search Tree(排序链表转换成二叉排序树)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 ...
- 笔试算法题(31):将有序数组转换成BST表示 & 线段树的应用
出题:要求将一个有序整数数组转换成最小深度的Binary Search Tree表示: 分析:由于需要是最小深度,所以BST应保持平衡,左右节点数大致相当,并且BST中当前根节点大于所有其左子树中的元 ...
随机推荐
- hdu 1811 Rank of Tetris (并查集+拓扑排序)
Rank of Tetris Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- memcached 学习 1—— memcached+spring配置
memcached 学习目录: memcached 学习 1—— memcached+spring配置 这几天自己搭建项目环境,解决问题如下: 有关常见的配置这里没有列出,中间遇到的搭建问题比较顺利g ...
- VS输入输出基本操作以及数据类型和类型转换
(一) C#项目的组成结构 项目结构 .config ---配置文件(存放配置参数文件) .csproj ---项目文件(管理文件项) .sln ---解决方案文件(管理项目) .cs - ...
- jQuery EasyUI Combobox无法检索中文输入的问题
在项目里使用了EasyUI的Combobox,当ComboBox的item是英文时,都能正常检索出对应项,但是如果使用中文输入法输入几个字母然后通过按shift键输入时,奇怪的事情发生了,combob ...
- hduacm 5104
http://acm.hdu.edu.cn/show #include <cstdio> #include <cstring> #include <algorithm&g ...
- mysql的binlog
mysql> show global variables like '%bin%'; +---------------------------------+------------------- ...
- Delphi日期时间 UNIX
Delphi日期时间,就是常见的 2014-05-02 10:37:35 --------------------------------------------------------------- ...
- win7 web开发遇到的问题-由于权限不足而无法读取配置文件,无法访问请求的页面
错误一: HTTP Error 500.19 - Internal Server Error配置错误: 不能在此路径中使用此配置节.如果在父级别上锁定了该节,便会出现这种情况.锁定是默认设置的 (ov ...
- Rhel6-lanmp架构配置文档
l--操作系统:windows linux unix mac OS a--网页发布软件:apache nginx iis m--数据库:mysql pgsql oracle... p--网页 ...
- FFT快速傅立叶变换的工作原理
实数DFT,复数DFT,FFTFFT是计算DFT的快速算法,但是它是基于复数的,所以计算实数DFT的时候需要将其转换为复数的格式,下图展示了实数DFT和虚数DFT的情况,实数DFT将时域中N点信号转换 ...