题目:
输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印。
例如输入
8
/ \
6 10
/ \ / \
5 7 9 11
输出8 6 10 5 7 9 11
解法:
我们利用队列来解决这个问题。
对列:队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
首先让根节点入队,作为队首,如果队首为NULL,则结束,如果不为空,弹出队首,输出队首元素,并将队首左右子孩子树压入队中,再然后,左子树为root,输出元素,压入左右子孩子树,然后是右子树..... 直到空为止。
首先我们定义头结点
struct TreeNode
{
int data;
TreeNode*left;
TreeNode*right;
};
建树
void BuildTree(TreeNode*&Node,int n)
{
if(Node==NULL)
{
TreeNode*newNode=new TreeNode();
newNode->data=n;
newNode->left=NULL;
newNode->right=NULL;
Node=newNode;
}else if(Node->data<n)
{
BuildTree(Node->right,n);
}
else
{
BuildTree(Node->left,n);
}
}
队输出
void OutPut()
{
if(P.front()==NULL)
return;
TreeNode*Node=P.front();
cout<<P.front()->data<<" ";//输出根元素
P.push(P.front()->left);//压入左右子树
P.push(P.front()->right);
P.pop();//出队先进先出左子树先出,输出元素后,它的左右子树又入队
OutPut();
}