创建/序列化

  • 技巧就在于helper method里preorder只需要纪录一个index,也就是每次循环的root,但是需要记录inorder的begin, end

  • private TreeNode buildTree(int[] preorder, int pre_index, int[] inorder, int in_start, int in_end)

public class Solution {
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        return buildTree(preorder, 0, inorder, 0, inorder.length - 1);
    }
    private TreeNode buildTree(int[] preorder, int pre_index, int[] inorder, int in_start, int in_end){
        if(pre_index >= preorder.length || in_start > in_end) return null;
        int rootVal = preorder[pre_index];
        int pos = in_start;
        while(pos <= in_end && inorder[pos] != rootVal){
            pos++;
        }
        int leftTreeLength = pos - in_start;
        TreeNode root = new TreeNode(rootVal);
        root.left = buildTree(preorder, pre_index + 1, inorder, in_start, pos - 1);
        root.right = buildTree(preorder, pre_index + leftTreeLength + 1, inorder, pos + 1, in_end);
        return root;
    }
}

2018/09/10

  • 笨方法, 存了prestart, preend, in_start, in_end

  • private TreeNode buildTree(int[] preorder, int[] inorder, int preBegin, int preEnd, int inBegin, int inEnd)

  • 只需要记录post_index, in_start, in_end三个变量

Serialize and Deserialize Binary Tree

  • 用 Queue实现bfs

  • 注意deserialize的时候,先poll from queue,然后判断String[] input接下来的两个是否为空,只有在不为空的时候才需要append

Last updated

Was this helpful?