剑指Offer(Java实现):替换空格 + 重建二叉树

本文介绍了一个字符串处理方法,用于将字符串中的空格替换为%20,以及一种通过前序和中序遍历数据重建二叉树的算法。详细展示了算法的实现过程,包括遍历字符串计算空格数量、生成新字符串和递归重建二叉树的步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.dengzm.jianzhioffer;

/**
 * @Description 005 替换空格
 * 请实现一个函数,把字符串中的每个空格替换成%20
 * Created by deng on 2018/12/19.
 */
public class Jianzhi005 {

    public static void main(String[] args) {
        String target = "We are happy !";
        System.out.println(replaceSpace(target));

    }

    //首先遍历字符串,找到空格的数量;则新的字符串的数量为当前字符串的长度加上两倍的空格数量
    //再次遍历字符串,生成新的字符串
    public static String replaceSpace(String target) {
        if (target == null || target.length() == 0) {
            return "Error : target string is empty!";
        }

        int count = 0;
        char[] targetString = target.toCharArray();
        for (char c : targetString) {
            if (c == ' ') {
                count ++;
            }
        }

        if (count == 0) {
            return target;
        }

        char[] resultString = new char[targetString.length + count * 2];
        int resultCount = 0;
        for (int i = 0; i < targetString.length; i ++) {
            if (targetString[i] != ' ') {
                resultString[resultCount] = targetString[i];
                resultCount ++;
            } else {
                resultString[resultCount] = '%';
                resultString[resultCount + 1] = '2';
                resultString[resultCount + 2] = '0';
                resultCount += 3;
            }
        }

        return String.valueOf(resultString);
    }
}

package com.dengzm.jianzhioffer;

/**
 * @Description 007 重建二叉树
 * 输入某二叉树的前序遍历和中序遍历,重建该二叉树。(假设二叉树中不含有重复的数字)
 * Created by deng on 2018/12/19.
 */
public class Jianzhi007 {

    public static void main(String[] args) {
        int[] pre = new int[] {1,2,4,7,3,5,6,8};
        int[] middle = new int[] {4,7,2,1,5,3,8,6};
        BinaryTreeNode root = rebuildTree(pre, middle);
        printTree(root);
    }

    //判空
    //前序遍历中第一位为root节点,找到后寻找中序中该节点的位置;递归计算对应左右位置(49-57行)
    public static BinaryTreeNode rebuildTree(int[] first, int[] middle) {
        if (first == null || first.length == 0 || middle == null || middle.length == 0 || first.length != middle.length) {
            return null;
        }

        return rebuildTreeCore(first, middle, 0, first.length - 1, 0, middle.length - 1);
    }

    private static BinaryTreeNode rebuildTreeCore(int[] first, int[] middle, int preOrderStart, int preOrderEnd,
                                                 int inOrderStart, int inOrderEnd) {
        int rootValue = first[preOrderStart];
        BinaryTreeNode rootNode = new BinaryTreeNode(rootValue);

        if (preOrderStart == preOrderEnd) {
            if (inOrderStart == inOrderEnd && first[preOrderStart] == middle[inOrderStart]) {
                return rootNode;
            } else {
                throw new RuntimeException("wrong data!");
            }
        }

        int inOrderMiddle = -1;
        for (int i = inOrderStart; i <= inOrderEnd; i ++) {
            if (middle[i] == rootValue) {
                inOrderMiddle = i;
                break;
            }
        }

        if (inOrderMiddle != -1) {
            int count = inOrderMiddle - inOrderStart;
            if (count > 0) {
                rootNode.mLeft = rebuildTreeCore(first, middle, preOrderStart + 1, preOrderStart + count, inOrderStart, inOrderMiddle - 1);

            }
            if (count < preOrderEnd - preOrderStart) {
                rootNode.mRight = rebuildTreeCore(first, middle, preOrderStart + count + 1, preOrderEnd, inOrderMiddle + 1, inOrderEnd);

            }
        } else {
            throw new RuntimeException("wrong data!");
        }

        return rootNode;
    }

    //print tree
    private static void printTree(BinaryTreeNode root) {
        if (root == null) return;
        System.out.println(root.value + ", ");
        printTree(root.mLeft);
        printTree(root.mRight);
    }

    static class BinaryTreeNode {
        int value;
        BinaryTreeNode mLeft;
        BinaryTreeNode mRight;

        BinaryTreeNode(int value) {
            this.value = value;
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值