华为笔试 5.6 第三题(部分)根据输入字符串构造树

第三题:给一个二叉树,然后计算树的最大路径;二叉树举例:1(2,3(4,5)) : 1是根,2和3是叶子,然后3又有4,5叶子。


感觉最难的就是构造树了,就写了一个(本人java菜鸡,你懂的)
后面的求最大路段和的没有写

  • 提取出输入字符串中所有的数字

    Scanner s = new Scanner(System.in);
    String line = s.nextLine();
    //        if(line.equals("")){
    //            System.out.println(0);
    //        }
    List<String> lineNumsList = Arrays.asList(line.split(",|\\(|\\)"));
    List<String> lineNums = new ArrayList<>(lineNumsList);
    Iterator<String> it = lineNums.iterator();
    while (it.hasNext()){
      if(it.next().equals("")){
          it.remove();
      }
    }
    int[] nums = new int[lineNums.size()];
    for (int i = 0; i < lineNums.size(); i++) {
      nums[i] = Integer.parseInt(lineNums.get(i));
    }
  • 构造树

    • 栈中保存父节点
    • 遇到 ( ,说明该节点为父节点,压栈
    • 遇到 , ,说明 , 后面的数栈顶的父节点的右子树,出栈
/**
 * 根据输入构造树
 * @param line  原始输入的字符串
 * @param nums  字符串中的所有数字
 * @return  返回树的根节点
 */
private static TreeNode constructTree(String line, int[] nums) {
    Stack<TreeNode> parents = new Stack<>();
    TreeNode root = new TreeNode(nums[0]);

    int numIndex = 1;
    char[] lineChar = line.toCharArray();
    TreeNode node = root;
    for (int i = 0; i < lineChar.length&&numIndex<nums.length; i++) {
        if(lineChar[i] == '('){
            parents.push(node);// 该节点为父节点
            if(lineChar[i+1]!=','){
                node.left = new TreeNode(nums[numIndex++]);
                node = node.left;
            }else{// 左子树为空
                node.left=null;
                i++;
            }
        }if(lineChar[i] == ','){// 取出栈中的父节点
            node = parents.pop();
            if(lineChar[i+1]!=')'){
                node.right = new TreeNode(nums[numIndex++]);
//                    System.out.println(node.val+" .right " + node.right.val);
                node = node.right;
            }else{// 右子树为空
                node.right = null;
                i++;
            }
        }
    }

    return root;
}


- 完整代码
```java
import java.util.*;

/**
 * 华为5.6 机试第三题
 * 根据字符串构造树
 * 测试:
 * -1(3,2)
 * 1(2(4,5),3(,5))
 * 1(2(4,6(2,7)),3(,5))
 */
public class Main {
    static class TreeNode{
        int val;
        TreeNode left;
        TreeNode right;
        public TreeNode(int val, TreeNode left, TreeNode right){
            this.val = val;
            this.left = left;
            this.right = right;
        }
        public TreeNode(int val){
            this(val, null, null);
        }
    }
    public static void main(String[] args) {
        // 构造树
        Scanner s = new Scanner(System.in);
        String line = s.nextLine();
//        if(line.equals("")){
//            System.out.println(0);
//        }
        List<String> lineNumsList = Arrays.asList(line.split(",|\\(|\\)"));
        List<String> lineNums = new ArrayList<>(lineNumsList);
        Iterator<String> it = lineNums.iterator();
        while (it.hasNext()){
            if(it.next().equals("")){
                it.remove();
            }
        }
        int[] nums = new int[lineNums.size()];
        for (int i = 0; i < lineNums.size(); i++) {
            nums[i] = Integer.parseInt(lineNums.get(i));
        }
        // 构造树
        TreeNode root = constructTree(line, nums);
        // 先序遍历验证一下一下
        System.out.println("--------先序验证--------");
        StringBuilder sb = new StringBuilder();
        preOrder(root, sb);
        System.out.println(sb.toString());
    }

    /**
     * 根据输入构造树
     * @param line  原始输入的字符串
     * @param nums  字符串中的所有数字
     * @return  返回树的根节点
     */
    private static TreeNode constructTree(String line, int[] nums) {
        Stack<TreeNode> parents = new Stack<>();
        TreeNode root = new TreeNode(nums[0]);

        int numIndex = 1;
        char[] lineChar = line.toCharArray();
        TreeNode node = root;
        for (int i = 0; i < lineChar.length&&numIndex<nums.length; i++) {
            if(lineChar[i] == '('){
                parents.push(node);// 该节点为父节点
                if(lineChar[i+1]!=','){
                    node.left = new TreeNode(nums[numIndex++]);
                    node = node.left;
                }else{// 左子树为空
                    node.left=null;
                    i++;
                }
            }if(lineChar[i] == ','){// 取出栈中的父节点
                node = parents.pop();
                if(lineChar[i+1]!=')'){
                    node.right = new TreeNode(nums[numIndex++]);
//                    System.out.println(node.val+" .right " + node.right.val);
                    node = node.right;
                }else{// 右子树为空
                    node.right = null;
                    i++;
                }
            }
        }

        return root;
    }

    /**
     * 先序遍历验证树结构
     * @param node  树节点
     * @param sb    StringBuilder
     */
    private static void preOrder(TreeNode node, StringBuilder sb) {
        if (node!=null){
            sb.append(node.val);
            if(node.left!=null){
                sb.append("(");
                preOrder(node.left, sb);
            }else if(node.right!=null){
                sb.append("(");
            };
            if(node.right!=null){
                sb.append(",");
                preOrder(node.right, sb);
                sb.append(")");
            }
        }
    }
}
#华为机试56##华为##面试题目#
全部评论
楼主最后A了吗
1 回复 分享
发布于 2020-05-07 20:18

相关推荐

不愿透露姓名的神秘牛友
05-20 16:14
已编辑
不止遇到一次了,什么都不会,让提合并请求,问什么是合并请求。让gitlab.页面把测试截图附上,不知道截图要放在哪,那么大的编辑看不到吗让配开发机,问ip是什么东西……这都咋进来的啊,我们(我2023年毕业)那会儿没AI的时候面试都是直接linux,docker,k8s,git,结构与算法,计网。怎么才过去2年,实习生跟傻子一样,有些问题问的我难受,不会git&nbsp;commit,不会git&nbsp;pull,不会切换分支,直接要覆盖master....————而且态度非常敷衍,3天前给开个仓库权限,连本地都没有拉下来。让写一个小文档,都是说一句,写一句,说把目录加上,挺嗤之以鼻,最后还是把目录加上了😂😂任何文档和注释都是方便后来人的,现在的人真的很自负啊,打开github看看任何一个开源项目的文档和注释,都写的很详细。难道现在的同学在校期间不经常拉开源项目看源码学习吗?&nbsp;哪怕是一个swap函数,开源项目里都经常注释:1&nbsp;3&nbsp;5&nbsp;7&nbsp;9&nbsp;2&nbsp;4&nbsp;6&nbsp;8&nbsp;10^&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;^l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rswap:{功能描述}{使用样例}————给我气笑了,没次问我有什么任务的时候,我都是说,优先你学校导师的项目,然后再做公司需求。然后给了两个需求,一个月内搞定就行,既然是agent开发,1.&nbsp;部署需要维护项目的开发环境2.阅读opencode/openclaude代码(我个人感觉龙虾的源码agent部分很常规,就一个channel+agent,还不如看claude泄露的代码和opencode)然后任务1搞了几周说因为环境问题,他申请到的远程开发机是linux,装的python2,项目是py3的,所以没搭建,我说你不行就用conda或docker把环境屏蔽了呢,没搭理我。任务2:看了很长时间代码,给我回了一句,opencode和openclaude是用go写的……我说你打开github看右下角那的语言是ts还是go……&nbsp;结果满脸懵的说ts是什么……我让看agent&nbsp;loop,哪怕全局搜索一下while(true),跳过去从头看到尾就大致清楚了,压根没看。————嘻嘻,我已经开始做社招简历了。
redf1sh:默认会git结果发现真不会,这种一看就是没做过项目的,真做过项目的至少会提交
点赞 评论 收藏
分享
评论
9
66
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务