题目:输入一颗二元查找树,将该树转换为它的镜像,

即在转换后的二元查找树中,左子树的结点都大于右子树的结点。

用递归和循环两种方法完成树的镜像转换。

例如输入:

       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. 二叉树转换成森林&amp;森林变成二叉树

    一,树转换成二叉树 1,将全部兄弟结点连起来; 2,保留第一个兄弟结点与父节点的连接,断开其它兄弟结点与父节点的连接,然后以根节点为轴依照顺时针方向旋转45度 watermark/2/text/aHR ...

  2. disk2vhd-----将windows系统转换成虚拟镜像格式

    工具介绍 下载url:http://technet.microsoft.com/en-us/sysinternals/ee656415.aspx disk2vhd是一个非常小的P2V转换工具,可以将你 ...

  3. VirtualBox 原始镜像转换成 vdi 镜像

    VBoxManage convertdd [-static] <filename> <outputfile> 将raw硬盘转换成vdi虚拟硬盘

  4. 【遍历二叉树】11把二叉树转换成前序遍历的链表【Flatten Binary Tree to Linked List】

    本质上是二叉树的root->right->left遍历. +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ...

  5. leetcode 114二叉树转换成链表

    解法一 可以发现展开的顺序其实就是二叉树的先序遍历.算法和 94 题中序遍历的 Morris 算法有些神似,我们需要两步完成这道题. 将左子树插入到右子树的地方 将原来的右子树接到左子树的最右边节点 ...

  6. Cracking-- 17.13 将二叉树转换成双向链表

    在书的105页 使用中根遍历的思想 left 之后 为 root 之后 为 right 则对左子树来说 left->right = root; root->left = left; 对右子 ...

  7. lintcode 453 将二叉树拆成链表

    将二叉树拆成链表   描述 笔记 数据 评测 将一棵二叉树按照前序遍历拆解成为一个假链表.所谓的假链表是说,用二叉树的 right 指针,来表示链表中的 next 指针. 注意事项 不要忘记将左儿子标 ...

  8. 【LeetCode-面试算法经典-Java实现】【109-Convert Sorted List to Binary Search Tree(排序链表转换成二叉排序树)】

    [109-Convert Sorted List to Binary Search Tree(排序链表转换成二叉排序树)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 ...

  9. 笔试算法题(31):将有序数组转换成BST表示 & 线段树的应用

    出题:要求将一个有序整数数组转换成最小深度的Binary Search Tree表示: 分析:由于需要是最小深度,所以BST应保持平衡,左右节点数大致相当,并且BST中当前根节点大于所有其左子树中的元 ...

随机推荐

  1. MyBatis框架Maven资源

      <!-- MyBatis框架 --> <dependency> <groupId>org.mybatis</groupId> <artifac ...

  2. JavaScript实现冒泡排序

    思想:从第一个元素开始,对数组中两两相邻的元素比较,将值较小的元素放在前面,值较大的元素放在后面,一轮比较完毕,一个最大的数沉底成为数组中的最后一个元素,一些较小的数如同气泡一样上浮一个位置.n个数, ...

  3. hdu----(2222)Keywords Search(trie树)

    Keywords Search Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  4. 2014---多校训练一(A Couple doubi)

    Couple doubi Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  5. 更准确的mysql全文索引

    MYSQL自带的全文索引在查找数据的时候,有非常多的限制,如字符少于3个不能搜索,常用字不能搜索 但mysql 的like进行查询的时候又非常的慢 但你需要用到比较准确的查询的时候,要么不用mysql ...

  6. 语句--分支语句if case

    语句是指程序命令,都是按照顺序执行的.语句在程序中的执行顺序称为“控制流”或者“执行流”.根据程序对运行时所收到的输入的响应,在程序每次运行时控制流可能有所不同. 语句可以嵌套,可以是以分号结尾的单行 ...

  7. fr

    8.3 credit sales(bad debt , ar) method1:direct write off method2:allowance method for bad debt allow ...

  8. Excel中连接函数CONCATENATE()

    直接API: CONCATENATE 函数语法具有下列参数 (参数:为操作.事件.方法.属性.函数或过程提供信息的值.): Text1 必需. 要连接的第一个文本项. Text2, ... 可选. 其 ...

  9. spring集成环境下的axis webservice的发布,调试

    在spring集成的环境下,无论你是ssh集成,还是ssi集成的情况下,发布webservice往往在调用的时候会出错. 特别是,如果你是这个方式: 将webservice打aar包,放到tomcat ...

  10. mysql在一台服务器搭建主从

    注:本环境事先执行rm -rf /usr/local/mysql   以方便实验. 1. 主与从,类似于A机器和B机器的连接,通过bin_log和rpel_log 进行数据连接 2. 如图所示: 3. ...