22、从上往下打印二叉树 && 59、把二叉树打印成多行

来源:互联网 发布:淘宝一周可以买多少次 编辑:程序博客网 时间:2024/06/06 00:19

题目描述:从上往下打印出二叉树的每个节点,同层节点从左至右打印。

时间限制:1秒 空间限制:32768K

有类似的想法,不过想到了遍历vector却没想到用队列,就把问题复杂化了,所以这道题还是借鉴了别人的方法。

思路:广度优先算法(BFS)

用一个队列放入还没有打印(放入结果容器)的节点,只要队列不为空,循环执行打印的过程,每次取队列最前面一个,同时删除队列里的这一个,将这个节点的值放入结果容器,并把这一节点的左右子节点放到队列后面。

需要注意的一点:放入左右子节点时,不需要判断子节点是否为空,因为如果是空,相当于把空指针放入队列,在取出后会判断,如果该节点为空就continue了。

代码:

/*struct TreeNode {    int val;    struct TreeNode *left;    struct TreeNode *right;    TreeNode(int x) :            val(x), left(NULL), right(NULL) {    }};*/class Solution {public:    vector<int> PrintFromTopToBottom(TreeNode* root) {        if(root==NULL)            return vector<int>();        queue<TreeNode*> que;        que.push(root);        vector<int> res;        while(!que.empty()){            root = que.front();            que.pop();            if(root==NULL)                continue;            res.push_back(root->val);            que.push(root->left);            que.push(root->right);        }        return res;    }};

后面一道相似的问题,59 把二叉树打印成多行

题目描述:从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。

思路:乍一看是和上一题相同的题目,区别就是需要按层分行打印,那么用什么来表示该换行了呢?

可以定义两个变量,一个变量表示在当前层中还没有打印的节点数,另一个变量表示下一层节点的数目。

代码:

/*struct TreeNode {    int val;    struct TreeNode *left;    struct TreeNode *right;    TreeNode(int x) :            val(x), left(NULL), right(NULL) {    }};*/class Solution {public:        vector<vector<int> > Print(TreeNode* pRoot) {            vector<vector<int> > res;            vector<int> temp;            if(pRoot==NULL)                return res;            queue<TreeNode*> nodes;            nodes.push(pRoot);            int toBePrinted = 1;//本层还没打印的节点个数            int nextlevel = 0;//下一层节点个数            while(!nodes.empty()){                TreeNode* pNode = nodes.front();                 nodes.pop();                toBePrinted--;                temp.push_back(pNode->val);                if(pNode->left!=NULL){                    nodes.push(pNode->left);                    nextlevel++;                }                if(pNode->right!=NULL){                    nodes.push(pNode->right);                    nextlevel++;                }                if(toBePrinted==0){//本层打印完了                    res.push_back(temp);                    temp.clear();                    toBePrinted = nextlevel;//开始打印下一层                    nextlevel = 0;//清空下一层的节点数                }            }            return res;        }};
原创粉丝点击