层次遍历--按照之字形分层打印

层次遍历--按照之字形分层打印

解题思路:

实现方式:两个栈+一个标记,标记切换两个栈,一个栈是先放左节点,再放右节点。另一个栈是先放右结点,在放左节点。

public static void main(String[] args) {
        TreeNode treeNode1=new TreeNode(1);
        TreeNode treeNode2=new TreeNode(2);
        TreeNode treeNode3=new TreeNode(3);
        TreeNode treeNode4=new TreeNode(4);
        TreeNode treeNode5=new TreeNode(5);
        TreeNode treeNode6=new TreeNode(6);
        TreeNode treeNode7=new TreeNode(7);
        treeNode1.left=treeNode2;
        treeNode1.right=treeNode3;
        treeNode2.left=treeNode4;
        treeNode2.right=treeNode5;
        treeNode3.left=treeNode6;
        treeNode3.right=treeNode7;

        printTreeNode(treeNode1);
    }
    public static void printTreeNode(TreeNode root){
        boolean flag=true;
        Stack<TreeNode> stack1=new Stack<>();
        Stack<TreeNode> stack2=new Stack<>();
        stack1.add(root);
        while(!stack1.isEmpty() || !stack2.isEmpty()){
            if(flag){
                TreeNode peek = stack1.peek();
                System.out.print(peek.val+" ");
                stack1.pop();
                if(peek.left!=null){
                    stack2.push(peek.left);
                }
                if(peek.right!=null){
                    stack2.push(peek.right);
                }

            }else{
                TreeNode peek = stack2.peek();
                System.out.print(peek.val+" ");
                stack2.pop();

                if(peek.right!=null){
                    stack1.push(peek.right);
                }
                if(peek.left!=null){
                    stack1.push(peek.left);
                }

            }

            if(flag){
                if(stack1.empty()){
                    System.out.println();
                    flag=!flag;
                }
            }else{
                if(stack2.empty()){
                    System.out.println();
                    flag=!flag;
                }
            }

        }
    }

猜你喜欢

转载自blog.csdn.net/u011243684/article/details/85316124