二叉树的分层遍历的汇总
2017-01-01 19:29
501 查看
二叉树的分层遍历分成一下五种。
1、从上到下分层遍历,每层从左到右,设置双指针,一个指针指向队列中二叉树一层的第一个节点,另外一个指针表示这一层的结尾节点的下一个节点
2、从上到下分层遍历,每层从右到左, 2有1改变左右孩子的入队列顺序即可。 3、从下到上分层遍历,每层从左往右, 要标示出二叉树的分层。之后逆序输出。
4、从下到上分层遍历,每层从右往左,4由三变化左右孩子的入队列顺序即可 5、按之字形分层输出,用双栈实现
测试二叉树的形状入下图所示:
控制台输出:
从上到下分层遍历,每层从左到右12 34 5 67 8从上到下分层遍历,每层从右到左13 26 5 48 7从下到上分层遍历,每层从左往右7 84 5 62 31从下到上分层遍历,每层从右往左8 76 5 43 21按之字形分层输出,用双栈实现13 24 5 68 7
代码如下:
import java.util.ArrayList;import java.util.Stack;/*** @author liyiwen1* @date 2016/12/27*/public class TreeBuilder{public static void main(String[] args) {Tree tree = builde(new Integer[]{1,2,3,4,5,6,null,null,null, 7,8});System.out.println("从上到下分层遍历,每层从左到右");tree.fencengLefeToRight();System.out.println("从上到下分层遍历,每层从右到左");tree.fencengRightToLeft();System.out.println("从下到上分层遍历,每层从左往右");tree.fencengDownUpLeftToRight();System.out.println("\r\n从下到上分层遍历,每层从右往左");tree.fencengDownUpRightToLeft();System.out.println("\r\n按之字形分层输出,用双栈实现");tree.fencengZprint();}public static Tree builde(Integer[] values){if (values != null && values.length != 0){Tree tree = new Tree();TreeNode[] nodes = new TreeNode[values.length];for (int i = 0; i < values.length; ++i){if (values[i] != null){TreeNode node = new TreeNode();node.value = values[i];nodes[i] = node;int parent = (i - 1) / 2;//父节点if (parent >= 0 && nodes[parent] != null){if (i % 2 == 0){//偶数为右孩子,奇数为左孩子nodes[parent].right = node;}else{nodes[parent].left = node;}}}}if (nodes[0] != null){tree.root = nodes[0];}return tree;}return null;}public static class Tree{private TreeNode root;//从上到下分层遍历,每层从左到右public void fencengLefeToRight(){if (root != null){ArrayList<TreeNode> nodes = new ArrayList<TreeNode>();int index = 0; int lastIndex = 1;nodes.add(root);while (index != lastIndex){while (index != lastIndex){TreeNode node = nodes.get(index);System.out.print(node.value + " ");if (node.left != null){nodes.add(node.left);}if (node.right != null){nodes.add(node.right);}++index;}if (lastIndex == index){System.out.print("\r\n");}index = lastIndex;lastIndex = nodes.size();}}}//从上到下分层遍历,每层从右到左public void fencengRightToLeft(){if (root != null){ArrayList<TreeNode> nodes = new ArrayList<TreeNode>();int index = 0; int lastIndex = 1;nodes.add(root);while (index != lastIndex){while (index != lastIndex){TreeNode node = nodes.get(index);System.out.print(node.value + " ");if (node.right != null){nodes.add(node.right);}if (node.left != null){nodes.add(node.left);}++index;}if (lastIndex == index){System.out.print("\r\n");}index = lastIndex;lastIndex = nodes.size();}}}//从下到上分层遍历,每层从左往右public void fencengDownUpLeftToRight(){if (root != null){ArrayList<TreeNode> nodes = new ArrayList<TreeNode>();nodes.add(root);nodes.add(null);int index = 0;while (index < nodes.size() && nodes.get(index) != null){//将节点放入队列,每层用null来区分while (nodes.get(index) != null){if (nodes.get(index).right != null){//右孩子先入队列nodes.add(nodes.get(index).right);}if (nodes.get(index).left != null){nodes.add(nodes.get(index).left);}++index;}if (index != nodes.size() - 1){nodes.add(null);}++index;}for (int i = nodes.size() - 1 ; i >= 0; --i){if (nodes.get(i) != null){System.out.print(nodes.get(i).value + " ");}else{if (i != nodes.size() - 1){System.out.print("\r\n");}}}}}//从下到上分层遍历,每层从右往左public void fencengDownUpRightToLeft(){if (root != null){ArrayList<TreeNode> nodes = new ArrayList<TreeNode>();nodes.add(root);nodes.add(null);int index = 0;while (index < nodes.size() && nodes.get(index) != null){//将节点放入队列,每层用null来区分while (nodes.get(index) != null){if (nodes.get(index).left != null){//左孩子先入队列nodes.add(nodes.get(index).left);}if (nodes.get(index).right != null){nodes.add(nodes.get(index).right);}++index;}if (index != nodes.size() - 1){nodes.add(null);}++index;}for (int i = nodes.size() - 1 ; i >= 0; --i){if (nodes.get(i) != null){System.out.print(nodes.get(i).value + " ");}else{if (i != nodes.size() - 1){System.out.print("\r\n");}}}}}//按之字形分层输出,用双栈实现public void fencengZprint(){Stack<TreeNode> oushu = new Stack<TreeNode>();Stack<TreeNode> jishu = new Stack<TreeNode>();oushu.add(this.getRoot());while (!oushu.isEmpty() || !jishu.isEmpty()){if (!oushu.isEmpty()){while (!oushu.isEmpty()){TreeNode node = oushu.pop();System.out.print(node.value + " ");if (node.left != null){//左孩子先入栈jishu.push(node.left);}if (node.right != null){jishu.push(node.right);}}System.out.print("\r\n");}else if (!jishu.isEmpty()){while (!jishu.isEmpty()){TreeNode node = jishu.pop();System.out.print(node.value + " ");if (node.right != null){//右孩子先入栈oushu.push(node.right);}if (node.left != null){oushu.push(node.left);}}System.out.print("\r\n");}}}public TreeNode getRoot() {return root;}private void setRoot(TreeNode root) {this.root = root;}public void preOrder(){preOrder(root);}public void midOrder(){midOrder(root);}private void preOrder(TreeNode node){if (node != null){System.out.println(node.value);preOrder(node.left);preOrder(node.right);}}private void midOrder(TreeNode node){if (node != null){midOrder(node.left);System.out.println(node.value);midOrder(node.right);}}}public static class TreeNode{private int value;private TreeNode left;private TreeNode right;}}
相关文章推荐
- 编程之美:第三章 结构之法 3.10分层遍历二叉树
- 编程之美--3.10 分层遍历二叉树
- 数据结构之二叉树的遍历汇总
- 3.10 分层遍历二叉树
- 二叉树判断(相同、分层遍历、平衡二叉树)
- 《编程之美》 3.10 分层遍历二叉树
- 分层遍历二叉树(按层次从上往下,从左往右)
- 分层遍历二叉树
- 编程之美3.10 分层遍历二叉树
- 按层遍历二叉树(不分层) -- 漫漫算法路 刷题篇
- 按层遍历打印二叉树(分层) -- 漫漫算法路 刷题篇
- 3.10 分层遍历二叉树 扩展问题一、二
- 编程之美-分层遍历二叉树
- 分层遍历二叉树
- 编程之美-分层遍历二叉树方法整理
- 《编程之美》——分层遍历二叉树
- [二叉树的分层遍历] 倒序的树
- 编程之美读书笔记---分层遍历二叉树
- 编程之美读书笔记3:3.10分层遍历二叉树
- 分层遍历二叉树