1102. Invert a Binary Tree (25)

来源:互联网 发布:厦门巨龙软件 编辑:程序博客网 时间:2024/05/16 04:12

1102. Invert a Binary Tree (25)

时间限制
400 ms
内存限制
65536 kB
代码长度限制
16000 B
判题程序
Standard
作者
CHEN, Yue

The following is from Max Howell @twitter:

Google: 90% of our engineers use the software you wrote (Homebrew), but you can't invert a binary tree on a whiteboard so fuck off.

Now it's your turn to prove that YOU CAN invert a binary tree!

Input Specification:

Each input file contains one test case. For each case, the first line gives a positive integer N (<=10) which is the total number of nodes in the tree -- and hence the nodes are numbered from 0 to N-1. Then N lines follow, each corresponds to a node from 0 to N-1, and gives the indices of the left and right children of the node. If the child does not exist, a "-" will be put at the position. Any pair of children are separated by a space.

Output Specification:

For each test case, print in the first line the level-order, and then in the second line the in-order traversal sequences of the inverted tree. There must be exactly one space between any adjacent numbers, and no extra space at the end of the line.

Sample Input:
81 -- -0 -2 7- -- -5 -4 6
Sample Output:
3 7 2 6 4 0 5 16 5 7 4 3 2 0 1
<pre name="code" class="cpp">#include <iostream>#include<stdio.h>#include<algorithm>#include <vector>#include <queue>using namespace std;struct Node{    int no;//编号    Node *leftChild;    Node *rightChild;    Node *parent;    Node(int f,Node *a,Node *b,Node *c)    {        no = f;        leftChild=a;        rightChild=b;        parent =c;    }};void showTree(Node*,vector<int>*);void InvertTree(Node *);void InOrderTraversal(Node *,vector<int>*);int main(){    int n,i;    scanf("%d",&n);    char leftnum,rigthnum;    vector<Node *>allNode;    for(i=0; i<n; i++)    {        Node *p = new Node(i,NULL,NULL,NULL);        allNode.push_back(p);    }    for(i=0; i<n; i++)    {        scanf("%*c%c %c",&leftnum,&rigthnum);        if(leftnum!='-')        {            allNode[i]->leftChild = allNode[leftnum-'0'];            allNode[leftnum-'0']->parent = allNode[i];        }        if(rigthnum!='-')        {            allNode[i]->rightChild = allNode[rigthnum-'0'];            allNode[rigthnum-'0']->parent = allNode[i];        }    }    int rootNum = -1;    for( i=0; i<n; ++i)    {        if(allNode[i]->parent==NULL)        {            rootNum = allNode[i]->no;            break;        }    }    vector<int>NodeIndex;    showTree(allNode[rootNum],&NodeIndex);    for(i=0; i<NodeIndex.size(); ++i)    {        printf("%d",NodeIndex[i]);        printf(i==NodeIndex.size()-1?"\n":" ");    }    InvertTree(allNode[rootNum]);    vector<int>Inorder;    InOrderTraversal(allNode[rootNum],&Inorder);    for(i=0; i<Inorder.size(); ++i)    {        printf("%d",Inorder[i]);        printf(i==Inorder.size()-1?"\n":" ");    }    return 0;}void showTree(Node *curNode,vector<int>*IndexArray){    Node *t;    queue<Node *>q;    if(curNode!=NULL)        q.push(curNode);    while(!q.empty()){        t = q.front();        q.pop();        IndexArray->push_back(t->no);        if(t->rightChild) q.push(t->rightChild);        if(t->leftChild) q.push(t->leftChild);    }}void InvertTree(Node *curNode){    if(curNode!=NULL)    {        swap(curNode->leftChild,curNode->rightChild);        InvertTree(curNode->rightChild);        InvertTree(curNode->leftChild);    }}void InOrderTraversal(Node *curNode,vector<int>* array){    if(curNode->leftChild!=NULL)        InOrderTraversal(curNode->leftChild,array);    array->push_back(curNode->no);    if(curNode->rightChild!=NULL)        InOrderTraversal(curNode->rightChild,array);}


0 0