您的位置:首页 > 编程语言

【编程题目】输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印

2014-08-04 19:41 239 查看
第 16 题(树):
题目(微软):
输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印。
例如输入
8
/ \
6 10
/ \ / \
5 7 9 11
输出 8 6 10 5 7 9 11。

思路:之前做USACO和学算法的时候经常用的 广度优先搜索

/*
第 16 题(树):
题目(微软):
输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印。
例如输入
8
/   \
6    10
/ \ /  \
5 7 9 11
输出 8 6 10 5 7 9 11。
start time = 19: 10
end time = 19:36
*/

//思路 广度优先遍历
#include <iostream>
#include <queue>
#include <stdlib.h>
using namespace std;

typedef struct BSTreeNode
{
int m_nValue; // value of node
BSTreeNode *m_pLeft; // left child of node
BSTreeNode *m_pRight; // right child of node
}BSTreeNode;

int addBSTreeNode(BSTreeNode * &T, int data)  //把data加入的以T为根的树中
{
if(T == NULL) //根节点单独处理
{
T = (BSTreeNode *)malloc(sizeof(BSTreeNode));
T->m_nValue = data;
T->m_pLeft = NULL;
T->m_pRight = NULL;
}
else
{
BSTreeNode * x = T;
BSTreeNode * px = NULL;
while(x != NULL)
{
if(data >= x->m_nValue)
{
px = x;
x = x->m_pRight;
}
else
{
px = x;
x = x->m_pLeft;
}
}

if(data >= px->m_nValue)
{
px->m_pRight = (BSTreeNode *)malloc(sizeof(BSTreeNode));
px->m_pRight->m_nValue = data;
px->m_pRight->m_pLeft = NULL;
px->m_pRight->m_pRight = NULL;
}
else
{
px->m_pLeft = (BSTreeNode *)malloc(sizeof(BSTreeNode));
px->m_pLeft->m_nValue = data;
px->m_pLeft->m_pLeft = NULL;
px->m_pLeft->m_pRight = NULL;
}
}
return 1;
}

int BFSPrintTree(BSTreeNode * T)
{
queue<BSTreeNode *> Q;
Q.push(T);

while(!Q.empty())
{
BSTreeNode * x = Q.front();
Q.pop();
printf("%d ", x->m_nValue);
if(x->m_pLeft != NULL)
{
Q.push(x->m_pLeft);
}
if(x->m_pRight != NULL)
{
Q.push(x->m_pRight);
}

}
return 1;
}

int main()
{
BSTreeNode * T = NULL;
addBSTreeNode(T, 8);
addBSTreeNode(T, 6);
addBSTreeNode(T, 10);
addBSTreeNode(T, 5);
addBSTreeNode(T, 7);
addBSTreeNode(T, 9);
addBSTreeNode(T, 11);

BFSPrintTree(T);
return 0;

}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐