二叉树的按层打印和蛇形打印java

  • 按层打印二叉树,即同层节点从左至右打印每个节点。例如下图,打印结果是:1-2-3-4-5-6-7

public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) {
        ArrayList<Integer> list = new ArrayList<Integer>();
        if(root==null){
            return list;
        }

        Queue<TreeNode> queue = new LinkedList<TreeNode>();
        queue.add(root);

        while(!queue.isEmpty()){
            TreeNode node = queue.poll();

            if(node.left!=null){
                queue.add(node.left);
            }
            if(node.right!=null){
                queue.add(node.right);
            }

            list.add(node.val);
        }

        return list;
    }
  • 蛇形打印二叉树,即第一行从左到右的顺序打印,第二行从右到左顺序打印,第三行从左到右……. ​​​​例如上图,打印结果是: 1-3-2-4-5-6-7
public static ArrayList<Integer> PrintShexing(TreeNode root) {
        ArrayList<Integer> arrayList = new ArrayList<Integer>();
        Queue<TreeNode> queue = new LinkedList<TreeNode>();
    	if(root==null) {
    		return arrayList;
    	}
    	queue.add(root);
    	boolean flag = true;
    	int size = 1;
    	
    	while(!queue.isEmpty()) {
    		ArrayList<Integer> templist = new ArrayList<Integer>();
    		
    		for(int i = 0;i<size;i++) {
    			TreeNode node = queue.poll();
    			if(flag) {
    				templist.add(node.val);
    			}else {
    				templist.add(0,node.val);
			}
    			
    			if(node.left!=null) {
    				queue.add(node.left);
    			}
    			if(node.right!=null) {
    				queue.add(node.right);
    			}
    		}
    		
    		arrayList.addAll(templist);
    		size = queue.size();
    		flag = flag?false:true;
    	}
    	
    	return arrayList;
    }

 

下面是二叉树树形打印Java代码实现: ``` public class BinaryTreePrinter { public static void printNode(TreeNode root) { int maxLevel = maxLevel(root); printNodeInternal(Collections.singletonList(root), 1, maxLevel); } private static void printNodeInternal(List<TreeNode> nodes, int level, int maxLevel) { if (nodes.isEmpty() || isAllElementsNull(nodes)) return; int floor = maxLevel - level; int edgeLines = (int) Math.pow(2, (Math.max(floor - 1, 0))); int firstSpaces = (int) Math.pow(2, (floor)) - 1; int betweenSpaces = (int) Math.pow(2, (floor + 1)) - 1; printWhitespaces(firstSpaces); List<TreeNode> newNodes = new ArrayList<>(); for (TreeNode node : nodes) { if (node != null) { System.out.print(node.val); newNodes.add(node.left); newNodes.add(node.right); } else { newNodes.add(null); newNodes.add(null); System.out.print(" "); } printWhitespaces(betweenSpaces); } System.out.println(""); for (int i = 1; i <= edgeLines; i++) { for (int j = 0; j < nodes.size(); j++) { printWhitespaces(firstSpaces - i); if (nodes.get(j) == null) { printWhitespaces(edgeLines + edgeLines + i + 1); continue; } if (nodes.get(j).left != null) System.out.print("/"); else printWhitespaces(1); printWhitespaces(i + i - 1); if (nodes.get(j).right != null) System.out.print("\\"); else printWhitespaces(1); printWhitespaces(edgeLines + edgeLines - i); } System.out.println(""); } printNodeInternal(newNodes, level + 1, maxLevel); } private static void printWhitespaces(int count) { for (int i = 0; i < count; i++) System.out.print(" "); } private static int maxLevel(TreeNode node) { if (node == null) return 0; return Math.max(maxLevel(node.left), maxLevel(node.right)) + 1; } private static boolean isAllElementsNull(List list) { for (Object object : list) { if (object != null) return false; } return true; } public static void main(String[] args) { TreeNode root = new TreeNode(1); root.left = new TreeNode(2); root.right = new TreeNode(3); root.left.left = new TreeNode(4); root.left.right = new TreeNode(5); root.right.left = new TreeNode(6); root.right.right = new TreeNode(7); printNode(root); } } class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } ``` 通过调用`printNode`方法,可以打印二叉树的树形结构。其中`TreeNode`类表示二叉树节点,`val`表示节点的值,`left`和`right`分别表示节点的左右子节点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值