您的位置:首页 > 其它

二叉树的分层遍历的汇总

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;}}

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息