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

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

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

例如输入:

       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. python3.x随手笔记2

    对象,价值观和类型 对象 Python的抽象的数据. 所有的数据在一个Python程序 表示对象或对象之间的关系. (在某种意义上,在 符合冯诺依曼模型的代码也“存储程序计算机” 由对象.) 每一个对 ...

  2. hdu----(2222)Keywords Search(ac自动机)

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

  3. .net读取xml文件中文乱码问题解决

    读取XML的编码方式Encoding.UTF8 要和<?xml version="1.0" encoding="utf-8"?>的encoding ...

  4. HDU 2546(01背包)

    饭卡 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submissi ...

  5. 8月10日 微软MVP巡讲 Windows 开发专题活动

    1.签到 2.准备工作 3.讲师正在准备 4.讲师发言 5.本次活动进行中 合影

  6. 为什么 Node.js 这么火,而同样异步模式 Python 框架 Twisted 却十几年一直不温不火?

    twisted是一个强大的异步网络框架,应用的面也非常广,但是没有这几年才出现的Node.js火,社区.文档也是很少可怜我觉得二者其实在本质上差不多,而且python使用起来还是比较容易一些的 匿名用 ...

  7. C#拉姆达(=>)表达式

    前言: 之前小猪曾经分享过自己对C#委托的一点理解 其实在使用委托的过程中我们会大量的使用拉姆达(=>)表达式 介绍: "Lambda表达式"是一个匿名函数,是一种高效的类似 ...

  8. 对Docker的价值和应用场景分析

    近年来,Docker在IT界可谓风光十足,各大技术论坛上赚足了眼球,公司内外也有相当多的介绍和尝试,看上去如此高大上的技术,貌似会给云.服务部署.运维等领域带来颠覆性的创新. 近期查阅了一些文档,较深 ...

  9. IBatis.net 输出SQL语句(七)

    一.IBatis.net输出SQL语句到控制台 输出IBatis.net生成的SQL语句到控制台,能够方便调试. 如果要想输出IBatis.net的SQL语句到控制台,那么只需要做如下配置即可: &l ...

  10. jquery判断多选框是否选中

    if($("#xieyi").is(":checked")){ alert('选中'); }else{ alert('没有选中') }