—【输入:】
—第一行:多叉树中的结点个数n(<=300,树中结点的编号为1到n)
—以下n行:i和j,i的父亲j。父亲结点为0的结点是树根。
—【输出:】
—一行,输出多叉树对应二叉树的中序遍历结果,每两个结点之间一个空格。
—【样例输入:】
—7
—2 1
—3 1
—4 1
—5 2
—6 2
—7 4
—1 0
—【样例输出:】
—7 4 3 6 5 2 1
首先这道题得知道多叉树与二叉树之间的转换规则——左孩子右兄弟。意思就是说,一棵由多叉树转换而来的二叉树的任意结点的左孩子是它在原树中的孩子,它的右孩子结点是它在原树中的兄弟结点。
如图所示,第二棵树中标号为4的结点的左儿子是它在第一棵树中的孩子结点,而它的右孩子3结点是它在原树中的兄弟结点。
所以这道题就十分好做了
首先输入数据n,表示有n个结点。
接下来一个for循环,输入结点号以及它的父亲结点;
用一个结构体存储树。
边输入边转换。
最后一个递归中序遍历二叉树输出结果。
源码如下:
#include<iostream> const int maxn=10000; struct tree { int lson; int rson; tree() {lson = 0; rson = 0;} }; tree a[maxn]; int tou; int bianli(int x) { if(a[x].lson!=0) { bianli(a[x].lson); } std::cout<<x<<' '; if(a[x].rson!=0) bianli(a[x].rson); } int main() { int n,i,j; std::cin>>n; for(int z=1;z<=n;z++) { std::cin>>i>>j; if(j==0) tou=i; else { if(a[j].lson==0) { a[j].lson=i; } else { a[i].rson=a[j].lson; a[j].lson=i; } } } bianli(tou); }