zoukankan      html  css  js  c++  java
  • IT公司100题-15-求二元查找树的镜像

    问题描述:

    输入一颗二元查找树,将该树转换为它的镜像树,即对每一个节点,互换左右子树。
     
    例如输入:
      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, 8);
        add_BSTree_node(root, 10);
        add_BSTree_node(root, 6);
        add_BSTree_node(root, 9);
        add_BSTree_node(root, 11);
        add_BSTree_node(root, 5);
        add_BSTree_node(root, 7);
    
        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, 8);
        add_BSTree_node(root, 10);
        add_BSTree_node(root, 6);
        add_BSTree_node(root, 9);
        add_BSTree_node(root, 11);
        add_BSTree_node(root, 5);
        add_BSTree_node(root, 7);
    
        mirror_change(root);
        print_tree(root);
        cout << endl;
    }
  • 相关阅读:
    2017ccpc全国邀请赛(湖南湘潭) E. Partial Sum
    Codeforces Round #412 C. Success Rate (rated, Div. 2, base on VK Cup 2017 Round 3)
    2017 中国大学生程序设计竞赛 女生专场 Building Shops (hdu6024)
    51nod 1084 矩阵取数问题 V2
    Power收集
    红色的幻想乡
    Koishi Loves Segments
    Wood Processing
    整数对
    Room and Moor
  • 原文地址:https://www.cnblogs.com/dracohan/p/3903455.html
Copyright © 2011-2022 走看看