关闭

按层次遍历二叉树

标签: 二叉树
199人阅读 评论(0) 收藏 举报
分类:

题目:有一棵二叉树,请设计一个算法,按照层次打印这棵二叉树,分层输出。
题目有两个难点,一个是二叉树的分层遍历,一个是换行输出。分层遍历时需要注意使用队列来存储访问过的节点的子节点,换行输出主要是考虑使用标志位来确定是否访问到了某一层的末尾。
《编程之美》上给出的解法:

struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};

class TreePrinter {
public:
    void printTree(TreeNode* root) {
        if(root = NULL)
            return;
        vector<TreeNode*> vec;
        vec.push_back(root);
        int cur = 0;
        int last = 1;
        while(cur<vec.size())
            {
            last = vec.size();
            while(cur<last)
                {
                cout<<vec[cur]->val<<" ";
                if(!vec[cur]->left)
                    vec.push_back(vec[cur]->left);
                if(!vec[cur]->right)
                    vec.push_back(vec[cur]->right);
                cur++;

}
            cout<<endl;

}


    }
};

牛客网上关于这道题目的要求是:
有一棵二叉树,请设计一个算法,按照层次打印这棵二叉树。
给定二叉树的根结点root,请返回打印结果,结果按照每一层一个数组进行储存,所有数组的顺序按照层数从上往下,且每一层的数组内元素按照从左往右排列。保证结点数小于等于500。
解法如下:

struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};

class TreePrinter {
public:
    vector<vector<int> > printTree(TreeNode* root) {
        int dep[550],head = 0,tail = 0;
        TreeNode *now,*q[550];
        q[tail ++] = root; dep[root->val] = 0;
        while(head != tail){
            now = q[head ++];
            if(now->left) q[tail ++] = now->left,dep[now->left->val] = dep[now->val] + 1;
            if(now->right) q[tail ++] = now->right,dep[now->right->val] = dep[now->val] + 1;
        }
        vector<vector<int> > ret;
        for(int j,i = 0;i < tail;i = j){
            vector<int> tmp;
            j = i;
            while(j < tail && dep[q[j]->val] == dep[q[i]->val]){
                tmp.push_back(q[j]->val);
                ++ j;
            }
            ret.push_back(tmp);
        }
        return ret;
    }
};
1
0
查看评论

按层次遍历二叉树算法

问题:按层次遍历二叉树 在网上看了一些按层次遍历二叉树的算法,这里修改了一下通过队列来按层次遍历二叉树的算法 ------------------------------------------------------- 网上说的通过队列来实现的解释是: 设置一个队列,然后只要队列不为空...
  • aaa791678470
  • aaa791678470
  • 2017-05-11 15:43
  • 456

C++数据结构--按层次遍历二叉树

1.按层次遍历二叉树图解    示例所用到的二叉树: 实现代码: #include #include using namespace std; template //节点类 class node ...
  • piniheaven
  • piniheaven
  • 2013-08-01 08:22
  • 2578

二叉树之层次遍历

下面是对层次遍历的一个实例,如果对二叉树不太了解请点击这里 任务要求:输入一棵二叉树,进行层次遍历,每个节点都按照从根节点到他的移动序列给出(L表示左,R表示右)。在输入中,每个节点的左右括号之间没有空格,相邻节点之间用一个空格隔开。每棵数的输入用一队空括号 () 表示结束(这对括号本身并不代表一个...
  • luomingjun12315
  • luomingjun12315
  • 2015-04-23 09:16
  • 14732

二叉树按层次遍历的递归用法

对于在学数据结构的大家,在编写二叉树的按层次遍历时往往会用非递归的方法,或许有人会问可不可以用递归来做呢? 对此,小编的答案是可以的。 相对于非递归,递归稍微要复杂些(这是由于二叉树中递归左子树递归右子树是完全与层次遍历相悖的),为此需要借助其他函数来实现 下面是小编写的按层次递归遍历二叉树的代码:...
  • YaoDeBiAn
  • YaoDeBiAn
  • 2016-06-07 22:15
  • 2562

按层次生成、遍历二叉树

对于二叉树一般是按深度生成和遍历,比如使用递归方法进行先序遍历、中序遍历、后序遍历。这次我们按层次生成和遍历二叉树。这种遍历方式关键在于需要使用一个队列保存“已处理该节点,但还没处理它的子节点”这样的节点。# Definition for singly-linked list. class BinT...
  • u013632190
  • u013632190
  • 2016-08-08 08:50
  • 1344

数据结构例程——二叉树的层次遍历算法

本文是数据结构基础系列(6):树和二叉树中第12课时层次遍历算法的例程。【二叉树的层次遍历算法】   实现二叉树的层次遍历算法,并对用”A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))”创建的二叉树进行测试。   请利用二叉树算法库。[参考解答](btreee.h见...
  • sxhelijian
  • sxhelijian
  • 2015-10-19 21:40
  • 11088

数据结构与算法系列-树-二叉树的遍历(按层次遍历)

按层次遍历算法 按层次遍历就是按二叉树层次从上而下,从左到右顺序访问其各结点 算法思想: 建立一循环队列,队列元素为指针类型变量,此循环队列用来暂存二叉树结点的指针。 在遍历二叉树之前,先将此树的根节点指针送入循环队列,开始层次遍历时再将此根节点指针出队来访问根节点,然后判断其左或右儿子是否...
  • SDN_SUPERUSER
  • SDN_SUPERUSER
  • 2013-11-12 20:37
  • 1704

[编程之美]二叉树的层次遍历

问题定义 给定一棵二叉树,要求按分层遍历该二叉树,即从上到下按层次访问该二叉树(每一层将单独输出一行),每一层要求访问的顺序为从左到右,并将节点依次编号。下面是一个例子: 输出: 1 2 3 4 5 6 7 8 节点的定义: structNode { ...
  • lalor
  • lalor
  • 2012-06-02 22:33
  • 26483

二叉树(前中后序递归非递归遍历,层次遍历,C++实现)

/*////////////////////////////////////////////////////////////////////////////// // 名 称 (Unit Name): BiTree.h 二叉树头文件 // 备
  • wangzirui0001
  • wangzirui0001
  • 2011-10-09 00:35
  • 3223

建立二叉树,按层次遍历分层次换行输出

测试输入:123##4##5## 输出:1             2 5             3 4 #include #include using namespac...
  • qq_34552886
  • qq_34552886
  • 2017-03-08 21:14
  • 464
    个人资料
    • 访问:111544次
    • 积分:3378
    • 等级:
    • 排名:第11802名
    • 原创:223篇
    • 转载:15篇
    • 译文:2篇
    • 评论:19条
    最新评论