您的位置:首页 > 移动开发 > Android开发

android复习路之二叉树层次遍历并且分层

2017-01-07 15:45 375 查看
二叉树的层次遍历,利用队列辅助实习,并且使用last和nlast 实现二叉树的分层,队列用的是stl里面的。核心点是用队列辅助实现层次遍历,也就是广度优先遍历,判断何时分层,当队列中的最后一个节点和队首元素相等的时候代表着一层结束了,也就是代码中的last和nlast相等的时候了,然后再让nlast指向现在的队尾元素直到下一次last和nlast相等也就是说nlast一直记录的是每一层的最后一个数字。直到最后一个元素弹出。

测试样例:1230048000500

输入树的形状:

1

   2       5

3 4

    8

代码:

#include <cstdlib>

#include <iostream>

#include <queue>

//size查看数目

//empty判空

//front 取队首

//back取队尾

//pop出栈

using namespacestd;

struct Node {

    int data ;

    structNode* left;

    structNode* right;

};

struct Node * Create(){//构建二叉树

    int x;

    structNode* tree;

    tree=(structNode*)malloc(sizeof(structNode));

    cin>>x;

    if (x==0) {

        tree=NULL;

    }

    else{

        tree->data=x;

        tree->left=Create();

        tree->right=Create();

        

    }

    return tree;

}

void print(structNode* tree){//将二叉树放入的一个队列中

    queue<structNode*>
q1;//创建一个队列用来存放节点

    q1.push(tree);//首先将树的根节点放入

 

   
int last=-1;//定义两个数分别指向出栈的数字和队列中的最后一个数字

    int nlast=tree->data;

    while (!q1.empty()) {

        last=q1.front()->data;//last指向队首元素

        if (q1.front()->left!=NULL)
{//判读左子树是否为空不为空的话加入到队列中

            q1.push(q1.front()->left);

        }

        if (q1.front()->right!=NULL)
{//判断右子树是否为空如果不为空加入到队列中

            q1.push(q1.front()->right);

        }

        

        if (nlast==last) {//判断nlast和last是否相同如果相同就是这一层的最后一个输出换行

            nlast=q1.back()->data;

            cout<<q1.front()->data<<endl;

        }

        else{//不相同就输出数字和空格

        cout<<q1.front()->data;

        }

        q1.pop();//出栈一个节点

        }

    }

int main()

{

    structNode* tree;

    tree=Create();

    print(tree);

}

输出结果: 

1

25

34

8
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息