1102. Invert a Binary Tree (25)
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:8 1 - - - 0 - 2 7 - - - - 5 - 4 6Sample Output:
3 7 2 6 4 0 5 1 6 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);
}