题目
问题 D: DS二叉树——二叉树之父子结点
时间限制: 1 Sec 内存限制: 128 MB
提交: 384 解决: 322
[ 提交] [ 状态] [ 讨论版]
题目描述
给定一颗二叉树的逻辑结构如下图,(先序遍历的结果,空树用字符‘0 ’表示,例如AB0C00D00),建立该二叉树的二叉链式存储结构。
编写程序输出该树的所有叶子结点和它们的父亲结点
输入
第一行输入一个整数t,表示有t个二叉树
第二行起,按照题目表示的输入方法,输入每个二叉树的先序遍历,连续输入t行
输出
第一行按先序遍历,输出第1 个示例的叶子节点
第二行输出第1 个示例中与叶子相对应的父亲节点
以此类推输出其它示例的结果
样例输入
3
AB0C00D00
AB00C00
ABCD0000EF000
样例输出
C D
B A
B C
A A
D F
C E
代码块
#include <iostream>
using namespace std;
int LeafNum = 0 ;
typedef struct BiTNode
{
char data;
struct BiTNode * lchild, * rchild;
} BiTNode;
typedef struct BiTree
{
BiTNode * root;
} BiTree;
void CreateTree ( BiTNode * & p)
{
char c;
cin>> c;
if ( c!= '0' )
{
p = new BiTNode;
p- > data = c;
CreateTree ( p- > lchild) ;
CreateTree ( p- > rchild) ;
}
else
p = NULL ;
}
void PreOrder1 ( BiTNode * p)
{
if ( p)
{
if ( ! p- > lchild && ! p- > rchild)
cout<< p- > data<< ' ' ;
PreOrder1 ( p- > lchild) ;
PreOrder1 ( p- > rchild) ;
}
}
void PreOrder2 ( BiTNode * p)
{
if ( p)
{
if ( p- > lchild)
{
if ( ! p- > lchild- > lchild && ! p- > lchild- > rchild)
cout<< p- > data<< ' ' ;
}
PreOrder2 ( p- > lchild) ;
if ( p- > rchild)
{
if ( ! p- > rchild- > rchild && ! p- > rchild- > lchild)
cout<< p- > data<< ' ' ;
}
PreOrder2 ( p- > rchild) ;
}
}
int main ( void )
{
int t;
cin>> t;
while ( t-- )
{
BiTree myTree;
CreateTree ( myTree. root) ;
PreOrder1 ( myTree. root) ;
cout<< endl;
PreOrder2 ( myTree. root) ;
cout<< endl;
}
return 0 ;
}