L2-004. 这是二叉搜索树吗?

来源:互联网 发布:nba2k14季后赛数据 编辑:程序博客网 时间:2024/06/11 18:17

本题要求:

一棵二叉搜索树可被递归地定义为具有下列性质的二叉树:对于任一结点,其左子树中所有结点的键值小于该结点的键值;其右子树中所有结点的键值大于等于该结点的键值;其左右子树都是二叉搜索树。所谓二叉搜索树的“镜像”,即将所有结点的左右子树对换位置后所得到的树。给定一个整数键值序列,现请你编写程序,判断这是否是对一棵二叉搜索树或其镜像进行前序遍历的结果。

输入格式:

输入的第一行给出正整数N(<=1000)。随后一行给出N个整数键值,其间以空格分隔。

输出格式:

如果输入序列是对一棵二叉搜索树或其镜像进行前序遍历的结果,则首先在一行中输出“YES”,然后在下一行输出该树后序遍历的结果。数字间有1个空格,一行的首尾不得有多余空格。若答案是否,则输出“NO”。

输入样例:

78 6 5 7 10 8 11

输出样例:

YES5 7 6 8 11 10 8

解题思路 :

直接按给定的数字创建二叉搜索树。接着先序遍历,看看是否与给定的数组相同。如果不相同,则进行镜像判断(就是先从右再左),进行先序遍历,看看是否与给定数组相同。注意输出的时候,如果镜像相同,就输出镜像。

代码 :

#include<iostream>#include<cstring>#include<sstream>#include<cmath>#include<cstdio>#include<algorithm>using namespace std;int a[1001];int n;class Node {    public:        int data;        Node* left;        Node* right;        Node(int d) {            data = d;            left = NULL;            right = NULL;        }        Node() {            this->data = 0;            left = NULL;            right = NULL;        }};class Tree {    public:        Node* head;        Tree() {            head = NULL;        }        bool isOk;        void insert(int k) {            head = insert(head, k);        }        void display() {            isYes = true;            i = 0;            display(head);            if (isYes) {                cout << "YES" << endl;                i = 0;                display2(head);            } else {                isYes = true;                i = 0;                display3(head);                if (isYes) {                    cout << "YES" << endl;                    i = 0;                    display4(head);                } else {                    cout << "NO" << endl;                }            }        }        bool isYes;    private:        int i;        void display(Node* node) {            if (node == NULL || !isYes) {                return;            }            if (node->data != a[i]) {                isYes = false;            }            i++;            display(node->left);            display(node->right);        }        void display2(Node* node) {            if (node == NULL) {                return;            }            display2(node->left);            display2(node->right);            if(i != 0) {                cout << " ";            }            cout << node->data;            i++;        }        void display3(Node* node) {            if (node == NULL || !isYes) {                return;            }            if (node->data != a[i]) {                isYes = false;            }            i++;            display3(node->right);            display3(node->left);        }        void display4(Node* node) {            if (node == NULL) {                return;            }            display4(node->right);            display4(node->left);            if(i != 0) {                cout << " ";            }            cout << node->data;            i++;        }        Node* insert(Node* node, int k) {            if (node == NULL) {                node = new Node(k);                return node;            }            if (k < node->data) {                node->left = insert(node->left, k);            } else {                node->right = insert(node->right, k);            }            return node;        }};int main() {    cin >> n;    Tree* tree = new Tree();    for(int i = 0; i < n; i++) {        cin >> a[i];        tree->insert(a[i]);    }    tree->display();    return 0;}
0 0
原创粉丝点击