3.10 分层遍历二叉树

题目1:写一个函数,打印二叉树中某层次的节点(从左到右),其中根节点为第0层。

思路:利用递归算法,思想是:要求访问二叉树中第k层的节点,那么其实就是要访问“以该二叉树根节点的左右子节点为根节点的两颗子树”中层次为k-1的节点

代码:

struct pNode {
    int data;
    pNode *lChild;
    pNode *rChild;
};

int printNodeAtLevel(pNode *root, int level) {
    if(root == NULL || level == -1) return 0;
    if(level == 0) {
        cout << root->data << ' ';
        return 1;
    }
    return printNodeAtLevel(root->lChile, level-1) + printNodeAtLevel(root->rChild, level-1);
}

题目二:

分层遍历一颗二叉树,如果用一个循环,来调用题目1中的代码的话,效率太低了,因为那样的话,每打印一层的信息的话, 那么都要从根节点重新开始往下找。

所以要找数据结构要存储上一层的信息,,当打印第k层的时候,直接找出k+1层的信息。

所以这里可以用队列来实现!

思路:

struct pNode {
    int data;
    pNode *lChild;
    pNode *rChild;
};

void PrintNodeByLevel(pNode *root) {
    if(root == NULL) return ;
    queue<Pnode *> root;
    q.push(root);
    while(!q.empty()) {
        cout << q.front()->data << ' ';
        if(q.front()->lChild) q.push(q.front()->lChild);
        if(q.front()->rChild) q.push(q.front()->rChild);
        q.pop();
    }
    return ;
}
时间: 2024-10-09 13:17:05

3.10 分层遍历二叉树的相关文章

【编程之美】3.10分层遍历二叉树

主要难度在于何时插入换行 学习到的:①vector 可以像数组一样用 不一定要用迭代器 代码及注释如下: #include<iostream> #include<queue> using namespace std; typedef struct BiTree { BiTree * pLeft, * pRight; int data; }BiTree; void createBiTree(BiTree * &T) { int d; cout << "p

分层遍历二叉树算法

分层遍历二叉树的集中情况 从上而下的打印 vector<vector<int>> printLevel(TreeNode *root) {          vector<vector<int>>  ret;     if(root == NULL) return ret;          queue<TreeNode *> q;     int size;     q.push_back(root);     while(!q.empty()

编程之美-分层遍历二叉树

问题:给定一个二叉树,要求按分层遍历该二叉树,即从上到下按层次访问该二叉树(每一层将单独输出一行),每一层要求访问的顺序为从左到右,并将节点依次编号.那么分层遍历如图的二叉树,正确的输出应该为: <span style="font-size:14px;">1 2 3 4 5 6 7 8</span> 书中还给出了问题2:打印二叉树中的某层次的节点(从左到右),其中根结点为第0层,成功返回true,失败返回false 分析与解法 关于二叉树的问题,由于其本身固有的

分层遍历二叉树

void printTopDown(BinaryTree* root) { deque<BinaryTree> dequeB; deque.push_back(root); while(!deque.empty()) { BinaryTree*p=deque.front(); cout<<p->value<<endl; if(p->left) dequeB.push_back(p->left); if(p->right) dequeB.push_

3.10分层打印二叉树的节点

#include<iostream> #include<vector> using namespace std; struct Node { char value; Node *left; Node *right; }; void create(Node *&T) { char c; cin>>c; if('#'==c) { T=NULL; } else { T=new Node; T->value=c; create(T->left); creat

网易:层次遍历二叉树

题目描述 分层遍历二叉树 用java实现树结构,分层遍历二叉树.给定一棵二叉树,要求按分层遍历该二叉树,即从上到下按层次访问该二叉树(每一层单独输出一行),每一层要求访问的顺序为从左到右,再按照相同规则从下至上遍历一遍,树节点定义如下 class Node { int data; Node left; Node right; } 输入描述 图: __1__ / __2__ 3__ / \ 4 __5__ 6 7 8 上面的输入为:1, 2, 3, 4, 5, 0, 6, 0, 0, 7, 8注:

二叉树分层遍历

首先定义二叉树的存储结构: 1 struct TreeNode { 2 int val; 3 TreeNode *left; 4 TreeNode *right; 5 6 TreeNode(int v, TreeNode* l = NULL, TreeNode *r = NULL) 7 :val(v), left(l), right(r) {} 8 }; 1.递归的方法(<编程之美>3.10) 二叉树本身就带有递归属性,通常我们可以用递归方法解决.假设要访问第k层节点,那么其实可以转皇城分别访

数据结构算法C语言实现(二十)--- 6.3.1遍历二叉树

一.简述 二叉树的遍历主要是先序.中序.后序及对应的递归和非递归算法,共3x2=6种,其中后序非递归在实现上稍复杂一些.二叉树的遍历是理解和学习递归及体会栈的工作原理的绝佳工具! 此外,非递归所用的栈及相关操作是第三章实现的,但数据类型做了更改. 二.头文件 1 //3_1.h 2 /** 3 author:zhaoyu 4 email:[email protected] 5 date:2016-6-7 6 note:realize my textbook <<数据结构(C语言版)>&g

SDUT 3341 数据结构实验之二叉树二:遍历二叉树

数据结构实验之二叉树二:遍历二叉树 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 已知二叉树的一个按先序遍历输入的字符序列,如abc,,de,g,,f,,, (其中,表示空结点).请建立二叉树并按中序和后序的方式遍历该二叉树. Input 连续输入多组数据,每组数据输入一个长度小于50个字符的字符串. Output 每组输入数据对应输出2行:第1行输出中序遍历序列:第2行输出后序遍历序列