二叉树系列1: 层次遍历二叉树
2016-03-25 00:05
295 查看
要求:从根节点开始,从上到下,从左到右逐层打印二叉树的节点。
方法1
TreeNode.java
package BinaryTree; public class TreeNode { int val; TreeNode left; TreeNode right; public TreeNode(TreeNode l, TreeNode r, int v) { left = l; right = r; val = v; } public TreeNode(int v) { val = v; } }
BinaryTreeTest.java
package BinaryTree; import java.util.LinkedList; public class BinaryTreeTest { public void LevelorderTraversal(TreeNode root) { if (root == null) { return; } LinkedList<TreeNode> queue = new LinkedList<>(); int parentCount = 1; int childrenCount = 0; queue.add(root); TreeNode p; while (!queue.isEmpty()) { p = queue.removeFirst(); System.out.printf("%-4d", p.val); parentCount--; if (p.left != null) { queue.add(p.left); childrenCount++; } if (p.right != null) { queue.add(p.right); childrenCount++; } if (parentCount == 0) { System.out.println(); parentCount = childrenCount; childrenCount = 0; } } } }
Main.java
package BinaryTree; public class Main { public static void main(String[] args) { /*** * 新建一个二叉树: * * 15 * / \ * 12 25 * / \ * 9 13 * ***/ TreeNode root = new TreeNode(15); TreeNode l = new TreeNode(12); root.left = l; TreeNode r = new TreeNode(25); root.right = r; TreeNode ll = new TreeNode(9); TreeNode lr = new TreeNode(13); l.left = ll; l.right = lr; BinaryTreeTest bTreeTest = new BinaryTreeTest(); bTreeTest.LevelorderTraversal(root); } }
方法二
上面的方法是利用了队列进行比较严谨地层次遍历。然而如果只是要得到每一层的节点,有另一种实现方法,可以使用任何的遍历次序,只要遍历的同时记录节点的层次关系就行了。下面的示例代码就是使用前序遍历输出层次遍历的结果。import java.util.ArrayList; public class Test2 { public ArrayList<ArrayList<TreeNode>> createLevelLinkedList(TreeNode root) { ArrayList<ArrayList<TreeNode>> lists = new ArrayList<>(); createLevelLinkedList(root,lists, 0); return lists; } /** * TreeNode root:子树的根节点 * lists: 保存每个层级的链表 * int level: 当前的层级 * */ private void createLevelLinkedList(TreeNode root, ArrayList<ArrayList<TreeNode>> lists, int level) { if(root == null){ return; } // 当前需要添加的那一层的链表 ArrayList<TreeNode> currLevelList; // 如果level大于等于lists的size,说明这一层的节点是首次访问到,所以需要新建一个链表 if(level >= lists.size()){ currLevelList = new ArrayList<>(); lists.add(currLevelList); }else{ // 否则,直接获取已存在的链表 currLevelList = lists.get(level); } // 采用先序遍历 currLevelList.add(root); createLevelLinkedList(root.left, lists, level+1); createLevelLinkedList(root.right, lists, level+1); } }
测试
public static void main(String[] args) { Test2 test = new Test2(); /*** * 新建一个二叉树: * * 15 * / \ * 12 25 * / \ * 9 13 * ***/ TreeNode root = new TreeNode(15); TreeNode l = new TreeNode(12); root.left = l; TreeNode r = new TreeNode(25); root.right = r; TreeNode ll = new TreeNode(9); TreeNode lr = new TreeNode(13); l.left = ll; l.right = lr; ArrayList<ArrayList<TreeNode>> lists = test.createLevelLinkedList(root); for (ArrayList<TreeNode> arrayList : lists) { for (TreeNode treeNode : arrayList) { System.out.printf("%-4d",treeNode.val); } System.out.println(); 4000 } }
输出
15 12 25 9 13
相关文章推荐
- AVL树-自平衡二叉查找树(Java实现)
- 文件遍历排序函数
- Lua 学习笔记之C API 遍历 Table实现代码
- C#遍历文件夹后上传文件夹中所有文件错误案例分析
- C#中遍历Hashtable的4种方法
- Erlang中遍历取出某个位置的最大值代码
- C++实现图的邻接矩阵存储和广度、深度优先遍历实例分析
- C++实现图的邻接表存储和广度优先遍历实例分析
- C语言二叉树的非递归遍历实例分析
- 使用C语言构建基本的二叉树数据结构
- 一波二叉树遍历问题的C++解答实例分享
- C++非递归队列实现二叉树的广度优先遍历
- php遍历目录方法小结
- 一个目录遍历函数
- php遍历删除整个目录及文件的方法
- PHP遍历文件夹与文件类及处理类用法实例
- PHP遍历XML文档所有节点的方法
- php中使用key,value,current,next和prev函数遍历数组的方法
- C#使用前序遍历、中序遍历和后序遍历打印二叉树的方法
- 平衡二叉树