剑指Offer:面试题23 从上往下打印二叉树

/*
从上往下打印二叉树:
从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺序打印。例如输入图4.5中的二叉树,则依次打印
出8、6、10、5、7、9、11
                                                    8
6 10
5 79 11


输入:
输入可能包含多个测试样例,输入以EOF结束。
对于每个测试案例,输入的第一行一个整数n(1<=n<=1000, :n代表将要输入的二叉树元素的个数(节点从1开始编号)。接下来一行有n个数字,代表第i个二叉树节点的元素的值。接下来有n行,每行有一个字母Ci。
Ci=’d’表示第i个节点有两子孩子,紧接着是左孩子编号和右孩子编号。
Ci=’l’表示第i个节点有一个左孩子,紧接着是左孩子的编号。
Ci=’r’表示第i个节点有一个右孩子,紧接着是右孩子的编号。
Ci=’z’表示第i个节点没有子孩子。
输出:
对应每个测试案例,
按照从上之下,从左至右打印出二叉树节点的值。
样例输入:
7
8 6 5 7 10 9 11
d 2 5
d 3 4
z
z
d 6 7
z
z
样例输出:
8 6 10 5 7 9 11




分析:
直接用队列就可以,压入根节点之后,压入其左右孩子(如果有的话),
*/
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <queue>


using namespace std;


const int MAXSIZE = 1002;


typedef struct TreeNode
{
int _iVal;
TreeNode* _left;
TreeNode* _right;
}TreeNode;
TreeNode nodeArr[MAXSIZE];
int _iIndex;


TreeNode* createNode()
{
++_iIndex;
nodeArr[_iIndex]._left = nodeArr[_iIndex]._right = NULL;
return &nodeArr[_iIndex];
}


void buildTree(TreeNode** pHead,int* pArr,int iLen)
{
if(!pHead || !(*pHead) || !pArr || iLen < 1 || iLen > 1000)
{
return ;
}
for(int i = 0 ; i < iLen ; i++)
{
if(i)
{
TreeNode* pNode = createNode();
pNode->_iVal = pArr[i];
}
else//建立头结点
{
(*pHead)->_iVal = pArr[i];
}
}
int iLeft,iRight;
for(int i = 1 ; i <= iLen ; i++)//建立父子结点之间的指向
{
char ch;
cin >> ch;
switch (ch)
{
case 'd':
scanf("%d %d",&iLeft,&iRight);
nodeArr[i]._left = &nodeArr[iLeft];
nodeArr[i]._right = &nodeArr[iRight];
break;
case 'l':
scanf("%d",&iLeft);
nodeArr[i]._left = &nodeArr[iLeft];
break;
case 'r':
scanf("%d",&iRight);
nodeArr[i]._right = &nodeArr[iRight];
break;
case 'z':
break;
default:
break;
}
}
}


void levelVisit(TreeNode* pHead)
{
queue<TreeNode*> queueNode;
queueNode.push(pHead);
bool isFirst = true;
while(!queueNode.empty())
{
TreeNode* pNode = queueNode.front();
if(!isFirst)
{
printf(" %d",pNode->_iVal);
}
else
{
isFirst = false;
printf("%d",pNode->_iVal);
}
queueNode.pop();
if(pNode->_left)
{
queueNode.push(pNode->_left);
}
if(pNode->_right)
{
queueNode.push(pNode->_right);
}
}
printf("\n");
}


void process()
{
int n;
while(EOF != scanf("%d",&n))
{
int iDataArr[MAXSIZE];
for(int i = 0 ; i < n ; i++)
{
scanf("%d",&iDataArr[i]);
}
memset(nodeArr,NULL,sizeof(nodeArr));
_iIndex = 0;
TreeNode* head = createNode();
TreeNode** pHead = &head;
buildTree(pHead,iDataArr,n);
levelVisit(head);
}
}


int main(int argc,char* argv[])
{
process();
getchar();
return 0;
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值