按之字形顺序打印二叉树&&把二叉树打印成多行

按之字形顺序打印二叉树

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

解题思路

利用Java中的LinkedList的底层实现是双向链表的特点

  1. 可用做队列,实现树的层次遍历
  2. 可双向遍历,奇数层从前往后遍历,偶数层从后往前遍历

代码

`import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;

/**

  • 剑指offer一刷:按之字形顺序打印二叉树
  • @author User
  • @create 2019-06-09-21:23
    */

public class jzo59 {
public ArrayList<ArrayList> Print(TreeNode pRoot) {
ArrayList<ArrayList> ret=new ArrayList<>();
if (pRoot==null){
return ret;
}
ArrayList list=new ArrayList<>();
LinkedList queue=new LinkedList<>();
queue.addLast(null); //层分隔符
queue.addLast(pRoot);
boolean leftToRight=true;

    while (queue.size()!=1){
        TreeNode node=queue.removeFirst();
        if (node==null){//到达层分隔符
            Iterator<TreeNode> iter=null;
            if (leftToRight){
                iter=queue.iterator();
            }else {
                iter=queue.descendingIterator();  //从后往前遍历
            }
            leftToRight=!leftToRight;
            while (iter.hasNext()){
                TreeNode temp=(TreeNode)iter.next();
                list.add(temp.val);
            }
            ret.add(new ArrayList<Integer>(list));
            list.clear();
            queue.addLast(null);   //添加分层符
            continue;
        }
        if(node.left!=null){
            queue.addLast(node.left);
        }
        if (node.right!=null){
            queue.addLast(node.right);
        }
    }
    return ret;
}
public static void main(String[] args){
    TreeNode node1=new TreeNode(1);
    TreeNode node2=new TreeNode(2);
    TreeNode node3=new TreeNode(3);
    TreeNode node4=new TreeNode(4);
    TreeNode node5=new TreeNode(5);
    TreeNode node6=new TreeNode(6);
    TreeNode node7=new TreeNode(7);
    TreeNode node8=new TreeNode(8);
    TreeNode node9=new TreeNode(9);
    node1.left=node2;
    node1.right=node3;
    node2.left=node4;
    node2.right=node5;
    node3.left=node6;
    node3.right=node7;
    node4.left=node8;
    node4.right=node9;
    jzo59 so=new jzo59();
    System.out.println(so.Print(node1));

}

}`

把二叉树打印成多行

从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。

解题思路

  1. 递归完成

代码

`
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;

/**

  • 剑指offer一刷:把二叉树打印成多行
  • @author User
  • @create 2019-06-10-11:22
    */

public class jzo60 {
ArrayList<ArrayList> Print(TreeNode pRoot) {
ArrayList<ArrayList> list = new ArrayList<>();
depth(pRoot, 1, list);
return list;
}

private void depth(TreeNode root, int depth, ArrayList<ArrayList<Integer>> list) {
    if(root == null) return;
    if(depth > list.size()) {
        list.add(new ArrayList<Integer>());
    }
    list.get(depth -1).add(root.val);

    depth(root.left, depth + 1, list);
    depth(root.right, depth + 1, list);
}
ArrayList<ArrayList<Integer> > Print1(TreeNode pRoot) {
    ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
    if(pRoot == null){
        return result;
    }
    Queue<TreeNode> layer = new LinkedList<TreeNode>();
    ArrayList<Integer> layerList = new ArrayList<Integer>();
    layer.add(pRoot);
    int start = 0, end = 1;
    while(!layer.isEmpty()){
        TreeNode cur = layer.remove();
        layerList.add(cur.val);
        start++;
        if(cur.left!=null){
            layer.add(cur.left);
        }
        if(cur.right!=null){
            layer.add(cur.right);
        }
        if(start == end){
            end = layer.size();
            start = 0;
            result.add(layerList);
            layerList = new ArrayList<Integer>();
        }
    }
    return result;
}
public static void main(String[] args){
    TreeNode node1=new TreeNode(1);
    TreeNode node2=new TreeNode(2);
    TreeNode node3=new TreeNode(3);
    TreeNode node4=new TreeNode(4);
    TreeNode node5=new TreeNode(5);
    TreeNode node6=new TreeNode(6);
    TreeNode node7=new TreeNode(7);
    TreeNode node8=new TreeNode(8);
    TreeNode node9=new TreeNode(9);
    node1.left=node2;
    node1.right=node3;
    node2.left=node4;
    node2.right=node5;
    node3.left=node6;
    node3.right=node7;
    node4.left=node8;
    node4.right=node9;
    jzo60 so=new jzo60();
    System.out.println(so.Print(node1));
    System.out.println(so.Print1(node1));

}

}`

猜你喜欢

转载自blog.csdn.net/weixin_41676282/article/details/91405991
今日推荐