1.二叉树的层次遍历(不换行)
二叉树的层次遍历可以基于广度优先遍历的思想,利用队列完成。具体的,(1)先将根节点入队,然后取根节点的值,并出队;(2)访问根节点的左子树,若存在,则入队;访问根节点的右子树,若存在,则入队;(3)循环(1)和(2),直到树为空。
//数据结构
struct TreeNode
{
int data;
TreeNode* left;
TreeNode* right;
TreeNode(int val):data(val){}
}
void BSTOrder(TreeNode* tree)
{
if(tree == NULL)
{
return;
}
queue<TreeNode*>treeQueue;
treeQueue.push(tree);
TreeNode* curTreeNode = null;
while(!queue.empty())
{
curTreeNode = treeQueue.front();
cout<<curTreeNode->data<<"\t";
treeQueue.pop();
if(tree->left != NULL)
{
treeQueue.push(tree->left);
}
if(tree->right != NULL)
{
treeQueue.push(tree->right);
}
}
}
2.二叉树的层次遍历(换行)
二叉树要按行输出需要记录输出是否达到该层的最右孩子,若是,则换行。可以访问根节点时,记录根节点的左右孩子的个数(也就是下一层),每次输出一次孩子
void BSTLinesOrder(TreeNode* tree)
{
if(tree == NULL)
{
return;
}
queue<TreeNode*>treeQueue;
TreeNode* curTreeNode = NULL;
int curTreeNodeCount = 1,nextTreeNodeCount = 0;
treeQueue.push(tree);
while(!treeQueue.empty())
{
curTreeNode = treeQueue.front();
treeQueue.pop();
cout<<curTreeNode->data<<"\t";
curTreeNodeCount--;
if(curTreeNode->left != NULL)
{
treeQueue.push(curTreeNode->left);
nextTreeNodeCount++;
}
if(curTreeNode->right != NULL)
{
treeQueue.push(curTreeNode->right );
nextTreeNodeCount++;
}
if(0 == curTreeNodeCount)
{
cout<<endl;
curTreeNodeCount = nextTreeNodeCount;
}
}
}
测试:
int main()
{
TreeNode* b1 = new TreeNode(1);
TreeNode* b2 = new TreeNode(2);
TreeNode* b3 = new TreeNode(8);
TreeNode* b4 = new TreeNode(4);
TreeNode* b5 = new TreeNode(9);
TreeNode* b6 = new TreeNode(6);
b1->leftChild = b2;
b1->rightChild = b3;
b2->leftChild = b4;
b2->rightChild = b5;
b3->leftChild = b6;
//BSFOrder(b1);
BSFLinesOrder(b1);
getchar();
return 0;
}