问题描述:

输入一颗二元查找树,将该树转换为它的镜像树,即对每一个节点,互换左右子树。
 
例如输入:
  6
/    \
4     12
/ \   /   \
2  5 8   16
输出:
  6
/     \
12     4
/   \   / \
16  8 5  2
定义二元查找树的结点为:
typedef struct BSTree {
    int data;
    BSTree* left;
    BSTree* right;
} Node;

分析:

方法1:递归交换左右子树。
// 15_1.cc
#include <iostream>
using namespace std;

typedef struct BSTree {
    int data;
    BSTree* left;
    BSTree* right;
} Node;

// 创建二元查找树
void add_BSTree_node(Node* &p_current, int data) {
    if (NULL == p_current) {
        Node *node = new Node();
        node->left = NULL;
        node->right = NULL;
        node->data = data;
        p_current = node;
    } else {
        if (p_current->data > data)
            add_BSTree_node(p_current->left, data);
        else if (p_current->data < data)
            add_BSTree_node(p_current->right, data);
        else
            cout << "The data has already in the tree.";
    }
}

// 转换二叉树为镜像树
void mirror_change(Node *root) {
    if(!root)
        return;

    // 交换左右子树
    Node* t = root->left;
    root->left = root->right;
    root->right = t;

    // 左右子树分别递归
    if(root->left)
        mirror_change(root->left);
    if(root->right)
        mirror_change(root->right);
}

// 中序打印镜像树
void print_tree(Node* root) {
    if (!root)
        return;
    cout << root->data << " ";
    print_tree(root->left);
    print_tree(root->right);
}

int main() {
    Node *root = NULL;
    add_BSTree_node(root, );
    add_BSTree_node(root, );
    add_BSTree_node(root, );
    add_BSTree_node(root, );
    add_BSTree_node(root, );
    add_BSTree_node(root, );
    add_BSTree_node(root, );

    mirror_change(root);
    print_tree(root);
    cout << endl;
}

方法2:使用栈模仿递归过程:

// 15_2.cc
#include <iostream>
#include <stack>
using namespace std;

typedef struct BSTree {
    int data;
    BSTree* left;
    BSTree* right;
} Node;

// 创建二元查找树
void add_BSTree_node(Node* &p_current, int data) {
    if (NULL == p_current) {
        Node *node = new Node();
        node->left = NULL;
        node->right = NULL;
        node->data = data;
        p_current = node;
    } else {
        if (p_current->data > data)
            add_BSTree_node(p_current->left, data);
        else if (p_current->data < data)
            add_BSTree_node(p_current->right, data);
        else
            cout << "The data has already in the tree.";
    }
}

// 转换二叉树为镜像树
void mirror_change(Node *root) {
    if(!root)
        return;

    stack<Node*> s;
    s.push(root);
    Node* p;

    while(!s.empty()) {
        p = s.top();
        s.pop();

        // 交换左右子树
        Node* t = p->left;
        p->left = p->right;
        p->right = t;

        // 左右子树分别入栈
        if(p->left)
            s.push(p->left);
        if(p->right)
            s.push(p->right);
    }
}

// 中序打印镜像树
void print_tree(Node* root) {
    if (!root)
        return;
    cout << root->data << " ";
    print_tree(root->left);
    print_tree(root->right);
}

int main() {
    Node *root = NULL;
    add_BSTree_node(root, );
    add_BSTree_node(root, );
    add_BSTree_node(root, );
    add_BSTree_node(root, );
    add_BSTree_node(root, );
    add_BSTree_node(root, );
    add_BSTree_node(root, );

    mirror_change(root);
    print_tree(root);
    cout << endl;
}

IT公司100题-15-求二元查找树的镜像的更多相关文章

  1. IT公司100题-16-层遍历二元树

    问题描述: 层遍历二叉树,同一层从左往右打印. 定义二元查找树的结点为: typedef struct BSTreeNode { int data; BSTreeNode *left; BSTreeN ...

  2. IT公司100题-9-判断整数序列是不是二元查找树的后序遍历结果

    问题描述: 输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果. 如果是返回true,否则返回false. 例如输入4, 8, 6, 12, 16, 14, 10,由于这一整数序列是如下树 ...

  3. IT公司100题-4-在二元树中找出和为某一值的所有路径

    问题描述: 输入一个整数和一棵二元树.从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径.打印出和与输入整数相等的所有路径. 例如输入整数30和如下二元树   14 / \ 5 16 / ...

  4. IT公司100题-11-求二叉树中节点的最大距离

    问题描述: 写程序,求一棵二叉树中相距最远的两个节点之间的距离. 10/     \6      14/   \   /   \4    8 12    16 分析: 二叉树中最远的两个节点,要么是根 ...

  5. IT公司100题-1-二叉树转换为双链表

    问题描述: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表.要求不能创建任何新的结点,只调整指针的指向. 10   /   \  6      14/  \    /   \4   8 1 ...

  6. 二元查找树转变成排序的双向链表之C#算法实现

    此题为July在CSDN发布的微软编程面试100题中的第一题,觉得蛮有趣的,今天也拿过来玩玩,July的代码用的是C++实现,可能因为有指针的原因吧,感觉看起来相对比较容易理解整个的实现过程,而我,试 ...

  7. 1.把二元查找树转变成排序的双向链表[BST2DoubleLinkedList]

    [题目]:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表.要求不能创建任何新的结点,只调整指针的指向. 比如将二元查找树 . 10 / \ 6 14 / \ / \ 4 8 12 16 转 ...

  8. MS - 1 - 把二元查找树转变成排序的双向链表

    ## 1. 把二元查找树转变成排序的双向链表 ## ### 题目: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表. ### 要求不能创建任何新的结点,只调整指针的指向. 10       ...

  9. IT公司100题-35- 求一个矩阵中最大的二维矩阵(元素和最大)

    问题描述: 求一个矩阵中最大的二维矩阵(元素和最大).如: 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 中最大的是: 4 5 9 10   分析: 2*2子数组的最大和.遍历求和,时 ...

随机推荐

  1. 【原】用css让一个容器水平垂直

    这种css布局平时用的比较多,也是面试题常出的一个题,网上一搜一大丢,不过还是想自己总结一下. 这种方法比较多,本文只总结其中的几种,以便加深印象. 效果图都为这个: 方法一:position加mar ...

  2. angularjs 作用域

    1.指令属性取值:通过attr.someAttribute属性名字获取 以下,通过$eval(attr.data)获取value <div ng-controller="personC ...

  3. vim linux SecureCRT vim颜色的设置

    解决方法: 1.首先按照环境一的方法检查一下,如果环境一的情况不在进行第二步. 2.修改终端TERM这个环境变量: 1)export命令 临时生效 # echo $TERM xterm   #如果结果 ...

  4. 无限轮播的N+2 策略

    N张照片把contentsSize设置为N+2个图片的宽度,例子如下,两端填充如图,当处于一端时,且即将进入循环状态的时候,如第二张图,从状态1滑动到状态2,在滑动结束的时候,将当前的位置直接转到状态 ...

  5. iOS开发数据库篇—SQLite简单介绍

    iOS开发数据库篇—SQLite简单介绍 一.离线缓存 在项目开发中,通常都需要对数据进行离线缓存的处理,如新闻数据的离线缓存等. 说明:离线缓存一般都是把数据保存到项目的沙盒中.有以下几种方式 (1 ...

  6. NHibernate扫盲

    NHibernate中Get和Load的区别 (1) get()采用立即加载方式,而load()采用延迟加载; get()方法执行的时候,会立即向数据库发出查询语句, 而load()方法返回的是一个代 ...

  7. SQL 总汇

    /* 启动MySQL */ net start mysql /* 连接与断开服务器 */ mysql -h 地址 -P 端口 -u 用户名 -p 密码 /* 跳过权限验证登录MySQL */ mysq ...

  8. Naming Service 与 Zookeeper

      命名服务是指通过指定的名字来获取资源或者服务的地址,提供者的信息.利用Zookeeper很容易创建一个全局的路径,而这个路径就可以作为 一个名字,它可以指向集群中的集群,提供的服务的地址,远程对象 ...

  9. WCF第一个Demo

    参考文献:http://www.cnblogs.com/artech/archive/2007/02/26/656901.html 自己学习的Demo 第一个是控制台宿主服务,第二个是Windows服 ...

  10. HDOJ 1914 The Stable Marriage Problem

    rt 稳定婚姻匹配问题 The Stable Marriage Problem Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 6553 ...