数据结构与算法面试题80道(16)

16:

题目(微软):

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

例如输入

 8

 / \

 6 10

/ \ / \

5 7 9 11

 

输出8 6 10 5 7 9 11

 

不想吐槽了,和上题简直一模一样。我是直接复制的上一题代码,将sawp函数直接换成了一个输出语句,就可以了

说下思路,层次遍历,明显就是把8放进去,拿出来,然后把6,10放进去,把6拿出来,把5,7放进去,把10拿出来, 把9,11放进去,然后一个一个往外拿,边拿边输出值。明显就是队列。早知道上题用栈写了,好歹是不同的代码。

贴代码了

#include<iostream>
#include<queue>
using namespace std;

struct BSTreeNode{
    int m_nValue;
    BSTreeNode *m_pLeft;
    BSTreeNode *m_pRight;
};

void addNode(BSTreeNode *&root,int value){
    if(root==NULL){
        BSTreeNode *tree=new BSTreeNode();
        if(tree==NULL) {cout<<"内存错误"<<endl;return ;}
        tree->m_nValue=value;
        tree->m_pLeft=NULL;
        tree->m_pRight=NULL;
        root=tree;
    }else if(root->m_nValue>value) addNode(root->m_pLeft,value);
    else if(root->m_nValue<value) addNode(root->m_pRight,value);
    else cout<<"结点重复"<<endl;
}

void loopTree(BSTreeNode *root){
    queue<BSTreeNode*>q;
    q.push(root);

    while(!q.empty()){
        BSTreeNode *t=q.front();
        q.pop();
        cout<<t->m_nValue<<" ";
        if(t->m_pLeft!=NULL) q.push(t->m_pLeft);
        if(t->m_pRight!=NULL) q.push(t->m_pRight);
    }
}

int main(){
    //建树
    BSTreeNode *root=NULL;
    addNode(root,8);
    addNode(root,6);
    addNode(root,10);
    addNode(root,5);
    addNode(root,7);
    addNode(root,9);
    addNode(root,11);

    loopTree(root);
    cout<<endl;
    return 0;
}

 

posted @ 2016-03-11 14:17  dreamOwn  阅读(1293)  评论(0编辑  收藏  举报