剑指offer-29.按之字型打印二叉树(176)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_38332722/article/details/100542120

29.按之字型打印二叉树(176)

  • 题目描述:请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。

  • 思路:对于奇数层结点:需要从右往左访问结点。对于偶数层结点:需要从左往右访问结点。

    奇数层结点从右往左访问结点的同时,并将其孩子结点(偶数层)压入一个空栈中(右孩子->左孩子),这样偶数层在访问的时候就是从左往右访问的该层的节点。

    偶数层结点从左往右访问结点的同时,并将其孩子结点(奇数层)压入一个空栈中(左孩子->右孩子),这样奇数层在访问的时候就是从右往左访问的该层的结点。

  • 代码

    package _29.按之字型打印二叉树;
    
    import java.util.ArrayList;
    import java.util.Stack;
    
    public class PrintTreeInSpeical {
        public static ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
        	ArrayList<ArrayList<Integer> > print = new ArrayList<ArrayList<Integer> >();
        	if(pRoot == null) return print;
        	
        	//用两个栈实现
        	//stack1:将父结点的孩子按顺序:左->右 进栈
        	Stack<TreeNode> stack1 = new Stack<>();
        	//stack2:将父结点的孩子按顺序:右->左 进栈
        	Stack<TreeNode> stack2 = new Stack<>();
        	
        	TreeNode node = pRoot;
        	stack1.push(node);
        	while(!stack1.isEmpty() || !stack2.isEmpty()){
        		ArrayList<Integer> list = new ArrayList<>();
        		if(!stack1.isEmpty()){
        			while(!stack1.isEmpty()){
            			//获取父结点
            			node = stack1.peek();
            			//将孩子结点入栈到stack2(左->右)
            			if(node.left != null)
            				stack2.push(node.left);
            			if(node.right != null)
            				stack2.push(node.right);
            			
            			//父结点出栈访问
            			node = stack1.pop();
            			list.add(node.val);
            		}
        		}
        		else{
        			while(!stack2.isEmpty()){
            			node = stack2.peek();
            			//将孩子结点入栈stack1(右->左)
            			if(node.right != null)
            				stack1.push(node.right);
            			if(node.left != null)
            				stack1.push(node.left);
            			
            			//父结点出栈访问
            			node = stack2.pop();
            			list.add(node.val);
            		}
        		}
        		print.add(list);
        	}
        	return print;
        }
        
        public static void main(String[] args) {
        	TreeNode root = new TreeNode(1);
    		TreeNode node1 = new TreeNode(2);
    		TreeNode node2 = new TreeNode(3);
    		TreeNode node3 = new TreeNode(4);
    		TreeNode node4 = new TreeNode(5);
    		TreeNode node5 = new TreeNode(6);
    		TreeNode node6 = new TreeNode(7);
    		root.left = node1;
    		root.right = node2;
    		node1.left = node3;
    		node1.right = node4;
    		
    		node2.left = node5;
    		node2.right = node6;
    		ArrayList<ArrayList<Integer>> print = Print(root);
    		System.out.println(print);
    	}
    }
    class TreeNode {
        int val = 0;
        TreeNode left = null;
        TreeNode right = null;
    
        public TreeNode(int val) {
            this.val = val;
        }
    }
    

猜你喜欢

转载自blog.csdn.net/qq_38332722/article/details/100542120
今日推荐