网易实习生真题(二叉树)

2016.3月的网易实习生机试题,考察了的对二叉树的灵活应用,理解中序遍历的用处!可能还有优化的解,大家自由发挥!

//有一棵二叉树,树上每个点标有权值,权值各不相同,请设计一个算法算出权值最大的叶节点到权值最小的叶节点的距离。
//二叉树每条边的距离为1,一个节点经过多少条边到达另一个节点为这两个节点之间的距离。
//给定二叉树的根节点root,请返回所求距离。

#include<iostream>
using namespace std;
#include<vector>
struct TreeNode {

    int val;

    struct TreeNode *left;

    struct TreeNode *right;

    TreeNode(int x) :

        val(x), left(nullptr), right(nullptr) {
    }
};

//1注意点 权值最大的叶子节点到权值最小的叶子节点,不是所有的节点,是叶子结点
//2.用俩个变量标记俩个节点的位置,求出根节点到他们的路径,如果有重复的路径就减去重复的路径的长度.

class Tree {
    void Inorder(TreeNode *root, vector<int>&v, int &small, int &big){
        //中序遍历获得最小的叶节点和最大的叶节点的索引
        if (!root)
            return;
        Inorder(root->left, v, small, big);
        v.push_back(root->val);
        if (root->left == NULL&&root->right == NULL){    //叶子节点   //跟着遍历的过程走,第一个叶子结点,samll=big,v里面加值,
            if (small == -1 || big == -1)
                small = big = (int)v.size() - 1;
            else{                                                    //第二个叶子结点,samll=big!=-1,v里面有第一个节点到到第二个叶子结点的路径值,比较改变samll和big的值
                if (root->val<v[small]) small = (int)v.size() - 1;
                if (root->val>v[big])   big = (int)v.size() - 1;
            }
        }
        Inorder(root->right, v, small, big);
    }
public:
    int getDis(TreeNode* root) {
        int small = -1, big = -1;
        vector<int>v;
        Inorder(root, v, small, big);  //v里面为中序遍历的节点值
        TreeNode * p = root;
        vector<int>v1, v2;
        int pos;
        while (true) {    //寻找路径
            pos = (int)(find(v.begin(), v.end(), p->val) - v.begin());//找到根节点的索引
            v1.push_back(v[pos]);  //存储的是根节点到最小目标节点的路径值
            if (small>pos)         //索引比较
                p = p->right;
            else if (small<pos)
                p = p->left;
            else
                break;
        }
        p = root;
        while (true) {
            pos = (int)(find(v.begin(), v.end(), p->val) - v.begin());
            v2.push_back(v[pos]);
            if (big>pos)
                p = p->right;
            else if (big<pos)
                p = p->left;
            else
                break;
        }
        int i, j;
        for (i = 0, j = 0; j<v2.size() - 1 && i<v1.size() - 1; ++i, ++j) {   //去重
            if (!(v1[i] == v2[j] && v1[i + 1] == v2[j + 1]))
                break;
        }
        return (int)v1.size() - 1 + (int)v2.size() - 1 - 2 * i;  //i为前面有几个相同的
    }
};
时间: 2024-08-29 04:45:07

网易实习生真题(二叉树)的相关文章

乘法表(百度2016实习生真题)

用堆排序只能过50%, TLE警告 时间复杂度分析 堆排序过程中是直接将数据当作乱序处理, 但乘法表是含有一定的顺序信息的, 条件比完全乱序强, 所以需要一个能把顺序信息用起来的方法 堆排序\((n*m)log(n*m)+klog(n*m)=(n*m)log(n*m)\) 原文地址:https://www.cnblogs.com/Akarinnnn/p/12590909.html

网易2017春招笔试真题编程题集合题解

01 双核处理 题目 一种双核CPU的两个核能够同时的处理任务,现在有n个已知数据量的任务需要交给CPU处理,假设已知CPU的每个核1秒可以处理1kb,每个核同时只能处理一项任务.n个任务可以按照任意顺序放入CPU进行处理,现在需要设计一个方案让CPU处理完这批任务所需的时间最少,求这个最小的时间. 输入描述 输入包括两行:第一行为整数n(1 ≤ n ≤ 50)第二行为n个整数lengthi,表示每个任务的长度为length[i]kb,每个数均为1024的倍数. 输出描述输出一个整数,表示最少需

回忆版华科计算机去年834真题

分享回忆版去年的真题,市面上所出现的花钱的真题建议慎买. 数据结构(90) 一.    单项选择题(10) 1. 二元组形式表为A=(D,R),D={01,02,03,04,05}R={r},r={<01.,02>, <01,03>,<01,04>,<02,05>,<02,03>},则数据结构A 是(). 集合B.树形结构C.线性结构D.图形结构 2.下列类型中不直用顺序结构存储的是(). A.树B.数组C.图D.广义表 3.下列存储结构中,()

2016 第七届蓝桥杯 c/c++ B组省赛真题及解题报告

2016 第七届蓝桥杯 c/c++ B组省赛真题及解题报告 勘误1:第6题第4个 if最后一个条件粗心写错了,答案应为1580. 条件应为abs(a[3]-a[7])!=1,宝宝心理苦啊.!感谢zzh童鞋的提醒. 勘误2:第7题在推断连通的时候条件写错了,后两个if条件中是应该是<=12 落了一个等于号.正确答案应为116. 1.煤球数目 有一堆煤球.堆成三角棱锥形.详细: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形), 第四层10个(排列成三角形). -. 假设一共

程序设计语言基本概念语 与经典真题

一.基本概念 在计算机中,程序设计语言可划分为低级语言和高级语言两大类,与高级语言相比,用低级语言开发的程序,其运行效率高,但开发效率低.与程序设计相关的基本概念如下. (1)低级语言:又称面向机器语言,它是特定的计算机系统所固有的语言. (2)汇编语言:是机器语言的一种提升,它使用了一些助记符来表示机器指令中的操作码和操作数.但它仍然是一种和计算机机器语言十分接近的语言,使用起来仍然不太方便. (3)高级语言:与人们的自然语言比较接近,使用起来很方便,也极大的提高了程序设计效率. (4)编译程

[华为机试真题]66.单词搜索

题目 代码 /*--------------------------------------- * 日期:2015-07-06 * 作者:SJF0115 * 题目:WordSearch * 来源:华为机试真题 -----------------------------------------*/ #include <iostream> #include <string> #include <vector> #include <stack> #include

九度oj 1034 寻找大富翁 2009年浙江大学计算机及软件工程研究生机试真题

题目1034:寻找大富翁 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:5323 解决:2123 题目描述:     浙江桐乡乌镇共有n个人,请找出该镇上的前m个大富翁. 输入:     输入包含多组测试用例.    每个用例首先包含2个整数n(0<n<=100000)和m(0<m<=10),其中: n为镇上的人数,m为需要找出的大富翁数, 接下来一行输入镇上n个人的财富值.    n和m同时为0时表示输入结束. 输出:     请输出乌镇前m个大富翁的财产数,财产多的

九度oj 1464 Hello World for U 2012年浙江大学计算机及软件工程研究生机试真题

题目1464:Hello World for U 时间限制:1 秒 内存限制:128 兆 特殊判题:否 提交:3872 解决:1082 题目描述: Given any string of N (>=5) characters, you are asked to form the characters into the shape of U. For example, "helloworld" can be printed as: h    de     ll      rlowo

蓝桥杯——真题训练之蚂蚁感冒

标题:蚂蚁感冒 长100厘米的细长直杆子上有n只蚂蚁.它们的头有的朝左,有的朝右. 每只蚂蚁都只能沿着杆子向前爬,速度是1厘米/秒. 当两只蚂蚁碰面时,它们会同时掉头往相反的方向爬行. 这些蚂蚁中,有1只蚂蚁感冒了.并且在和其它蚂蚁碰面时,会把感冒传染给碰到的蚂蚁. 请你计算,当所有蚂蚁都爬离杆子时,有多少只蚂蚁患上了感冒. [数据格式] 第一行输入一个整数n (1 < n < 50), 表示蚂蚁的总数. 接着的一行是n个用空格分开的整数 Xi (-100 < Xi < 100),