二叉树的层序遍历

二叉树层序遍历即从上往下、自左而右地访问每个节点,但按这样的顺序的话,相邻访问的两个节点间大多没有直接联系,不易访问,所以会显得比较麻烦,不过我们有队列这个好东西,建一个顺序表队列,里面按顺序存入每个节点的地址,之后在队列中按顺序访问就行了。关键是用队列到底能不能恰好地把每一个节点按从上往下、自左而右的顺序存储起来呢?请看如下分析。

local表示当前访问的节点在队列中的位置,length表示队列的长度。local=0时在访问A,此时可把B、C加入队列,length=3;当local=1访问B时,恰好能把D、E依次放在队尾,且队列中的元素顺序符合“层序”,依次类推。显然length最大值会是二叉树元素总数,当最终扫描到最后一个元素时local=length,此时结束循环。实现代码如下:

 1 #define SIZE_OF_QUEUE 256
 2 //lchild指向左子树
 3 //rchild指向右子树
 4 typedef struct BTree{
 5     int data;
 6     struct BTree *lchild;
 7     struct BTree *rchild;
 8 }BT;
 9
10 void displayByLevel(BT root){
11     BT queue[SIZE_OF_QUEUE];
12     int local;
13     int length;
14     queue[0] = root;
15     local = 0;
16     length = 1;
17     while(local < length){
18         printf("%d\n", queue[local]->data);
19         if(queue[local]->lchild != NULL)
20             queue[length++] = queue[local]->lchild;
21         if(queue[local]->rchild != NULL)
22             queue[length++] = queue[local]->rchild;
23         local++;
24     }
25 }
时间: 2024-10-11 23:06:39

二叉树的层序遍历的相关文章

笔试算法题(37):二叉树的层序遍历 &amp; 最长递增的数字串

出题:要求层序遍历二叉树,从上到下的层次,每一层访问顺序为从左到右,并将节点一次编号,输出如下:如果只要求打印指定的level的节点,应该如何实现. a b  c d  e  f  g h  i  分析: 原始的层序遍历类似于BFS,打印当前访问的节点curNode的序列号,并将其直接子节点放入队列queue中,然后从queue中取出下一个节点,直 到队列为空:此方法仅能按照层序打印所有节点,并不能区分每一层节点的数量:如果需要区分当前层次的节点,和当前层次节点的子节点,可以使用两个队列 que

Leetcode 102. Binary Tree Level Order Traversal(二叉树的层序遍历)

Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, level by level). For example: Given binary tree [3,9,20,null,null,15,7], 3 / 9 20 / 15 7 return its level order traversal as: [ [3], [9,20], [15,7] ]

leetcode题解:Tree Level Order Traversal II (二叉树的层序遍历 2)

题目: Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left to right, level by level from leaf to root). For example:Given binary tree {3,9,20,#,#,15,7}, 3 / 9 20 / 15 7 return its bottom-up level order tr

leetcode 题解:Binary Tree Level Order Traversal (二叉树的层序遍历)

题目: Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, level by level). For example:Given binary tree {3,9,20,#,#,15,7}, 3 / 9 20 / 15 7 return its level order traversal as: [ [3], [9,20], [15,7] ] co

二叉树的层序遍历、二叉树叶节点输出算法、求二叉树的高度、层序创建一棵二叉树

二叉树的层序遍历 1 void LevelorderTraversal(BinTree BT) 2 { 3 std::queue<BinTree> Queue; 4 BinTree T; 5 if (!BT) 6 return; //若是空树则直接返回 7 Queue.push(BT); 8 while (!Queue.empty()) 9 { 10 T = Queue.front(); 11 Queue.pop(); 12 printf("%c ", T->Data

Java数据结构系列之——树(6):二叉树的层序遍历

package tree.binarytree; import java.util.LinkedList; /** * 层序遍历二叉树 * * @author wl * */ public class PrintFromTopToBotton { public static void printfromtoptobotton(BiTreeNode root) { if (root == null) { return; } LinkedList<BiTreeNode> queue = new L

二叉树的层序遍历和二叉树的线索化

先根,后子树:先左子树,后右子树 二叉树的根节点 a 入队 a 的子树,根节点 b 和 c 分别入队 然后 b 的子树的根节点入队(为空) c 的子树的根节点入队 d 的子树的根节点入队(为空) e 的子树的根节点入队 f 的子树的根节点入队(为空) g的子树的根节点入队(为空)结束层序遍历,整个过程就是一层层的遍历,依靠一个队列来存放临时查找的结点. 二叉树线索化 问题的提出:当以二叉链表作为存储结构时,只能找到结点的左右孩子的信息,而不能直接找到结点的任一序列的前驱与后继信息,这种信息只有在

二叉树的层序遍历--结合递归算法

层序遍历 规则是:若树为空,则空操作返回,否则从树的第一层,也就是根结点开始访问,从上而下逐层遍历,在同一层中,按从左到右的顺序对结点逐个访问.如图: 代码实现 BiTree TreeQueue[1024]; int front = 0; int rear = 0; int LevelOrderTraverse(BiTree T) { if (!isTreeExits) { cout << "二叉树不存在"; return -1; } if (!T&&isR

LeetCode OJ:Binary Tree Level Order Traversal(二叉树的层序遍历)

Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, level by level). For example:Given binary tree {3,9,20,#,#,15,7}, 3 / 9 20 / 15 7 return its level order traversal as: [ [3], [9,20], [15,7] ] 层序遍历,既