剑指Offer

1.5 二叉树(4)

2017-12-27  本文已影响11人  coderjiege

二叉树相关问题解题套路


注意点


目录


从上往下打印二叉树

从上往下打印出二叉树的每个节点,同层节点从左至右打印。

public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) {
    ArrayList<Integer> res = new ArrayList<>();
    if (root == null) {
        return res;
    }
    LinkedList<TreeNode> queue = new LinkedList<>();
    queue.add(root);
    while (!queue.isEmpty()) {
        TreeNode p = queue.poll();
        res.add(p.val);
        if (p.left != null) {
            queue.add(p.left);
        }
        if (p.right != null) {
            queue.add(p.right);
        }
    }
    return res;
}

把二叉树打印成多行

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

ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
    ArrayList<ArrayList<Integer>> res = new ArrayList<>();
    ArrayList<Integer> list = new ArrayList<>();
    if (pRoot == null) {
        res.add(list);
        return res;
    }
    LinkedList<TreeNode> queue = new LinkedList<>();
    queue.add(pRoot);
    // last 存放当前行最右节点,nlast保存最新加入队列的节点
    TreeNode last = pRoot, nlast = pRoot;
    while (!queue.isEmpty()) {
        TreeNode p = queue.poll();
        list.add(p);
        if (p.left != null) {
            queue.add(p.left);
            nlast = p.left;
        }
        if (p.right != null) {
            queue.add(p.right);
            nlast = p.right;
        }
        // 当队列弹出的节点跟last节点相同,说明这一行打印完了
        // last更新为nlast,也就是下一行的最右节点
        if (p == last) {
            last = nlast;
            res.add(list);
            list = new ArrayList<>();
        }
    }
    return res;
}

按之字形顺序打印二叉树

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

public ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
    ArrayList<ArrayList<Integer>> res = new ArrayList<>();
    ArrayList<Integer> list = new ArrayList<>();
    if (pRoot == null) {
        return res;
    }
    LinkedList<TreeNode> queue = new LinkedList();
    queue.add(pRoot);
    boolean leftToRight = true;
    TreeNode left = pRoot, right = pRoot;
    while (!queue.isEmpty()) {
        if (leftToRight) {
            TreeNode p = queue.poll();
            list.add(p.val);
            if (p.left != null) {
                queue.add(p.left);
            }
            if (p.right != null) {
                queue.add(p.right);
            }
            if (p == right) {
                left = queue.peek();
                res.add(list);
                list = new ArrayList<>();
            }
        } else {
            TreeNode p = queue.pollLast();
            list.add(p.val);
            if (p.right != null) {
                queue.addFirst(p.right);
            }
            if (p.left != null) {
                queue.addFirst(p.left);
            }
            if (p == left) {
                right = queue.peekLast();
                res.add(list);
                list = new ArrayList<>();
            }
        }
        leftToRight = !leftToRight;
    }
    return res;
}

序列化二叉树

请实现两个函数,分别用来序列化和反序列化二叉树

String Serialize(TreeNode root) {
    if (root == null) {
        return "[]";
    }
    StringBuilder sb = new StringBuilder();
    LinkedList<TreeNode> q = new LinkedList<>();
    q.add(root);
    sb.append("[").append(root.val).append(",");
    while (!q.isEmpty()) {
        TreeNode p = q.poll();
        if (p.left != null) {
            sb.append(p.left.val).append(",");
            q.add(p.left);
        } else {
            sb.append("#,");
        }
        if (p.right != null) {
            sb.append(p.right.val).append(",");
            q.add(p.right);
        } else {
            sb.append("#,");
        }
    }
    return sb.deleteCharAt(sb.length() - 1).append("]").toString();
}

TreeNode Deserialize(String str) {
    if (str == null || str.equals("[]")) {
        return null;
    }
    String[] arr = str.substring(1, str.length() - 1).split(",");
    int k = 0, len = arr.length;
    LinkedList<TreeNode> q = new LinkedList<>();
    TreeNode root = new TreeNode(Integer.valueOf(arr[k++]));
    q.add(root);
    while (k < len && !q.isEmpty()) {
        TreeNode p = q.poll();
        if (k < len && !"#".equals(arr[k])) {
            p.left = new TreeNode(Integer.valueOf(arr[k]));
            q.add(p.left);
        }
        k++;
        if (k < len && !"#".equals(arr[k])) {
            p.right = new TreeNode(Integer.valueOf(arr[k]));
            q.add(p.right);
        }
        k++;
    }
    return root;
}

上一篇下一篇

猜你喜欢

热点阅读