2020秋招-360筆試題-尋宗問祖

年輕即出發(fā)...

簡書http://www.itdecent.cn/u/7110a2ba6f9e

知乎https://www.zhihu.com/people/zqtao23/posts

GitHub源碼https://github.com/zqtao2332

個人網(wǎng)站http://www.zqtaotao.cn/ (停止維護(hù)更新內(nèi)容)

QQ交流群:606939954

? 咆哮怪獸一枚...嗷嗷嗷...趁你現(xiàn)在還有時間,盡你自己最大的努力。努力做成你最想做的那件事,成為你最想成為的那種人,過著你最想過的那種生活。也許我們始終都只是一個小人物,但這并不妨礙我們選擇用什么樣的方式活下去,這個世界永遠(yuǎn)比你想的要更精彩。

最后:喜歡編程,對生活充滿激情



本節(jié)內(nèi)容預(yù)告

2020秋招-360筆試題-尋宗問祖



2020秋招-360筆試題-尋宗問祖

尋祖問宗

時間限制:C/C++語言 1000MS;其他語言 3000MS
內(nèi)存限制:C/C++語言 65536KB;其他語言 589824KB

題目描述
姓氏是人的符號標(biāo)志,是家族血脈的傳承;族譜是家族血脈傳承的文字記載。同姓的兩個中國人,根據(jù)族譜或許能夠查出上面幾代內(nèi)是同一個祖先。
查一下族譜,也許當(dāng)代某位同姓名人就是你的遠(yuǎn)房親戚,驚喜不驚喜,意外不意外!??!

360筆試題-尋宗問祖.png

輸入

二元查找樹(
1.若左子樹不空,左子樹值都小于父節(jié)點;
2.如右子樹不空,右子樹值都大于父節(jié)點;
3.左、右子樹都是二元查找樹;

4.沒有鍵值相等的節(jié)點)上任意兩個節(jié)點的值,請找出它們最近的公共祖先。

輸入三行行,第一行為樹層級,第二行為數(shù)節(jié)點(其中-1表示為空節(jié)點),第
三行為需要查找祖先的兩個數(shù)。
在例圖中(虛線框沒有真實節(jié)點,為了輸入方便對應(yīng)位置輸-1)查找12和20的最近公共祖先輸入為:

4
9 6 15 2 -1 12 25 -1 -1 -1 -1 -1 -1 20 37
12 20

輸出

輸出給出兩個數(shù)在樹上的最近公共祖先數(shù)值,如果沒有公共祖先,輸出-1;如果其中一個節(jié)點是另一個節(jié)點的祖先,

輸出這個祖先點(如例圖中找15、20最近公共祖先,輸出15);如果輸入無效,輸出-1。
樣例輸入

4
9 6 15 2 -1 12 25 -1 -1 -1 -1 -1 -1 20 37
12 20
樣例輸出
15
package cn.zqtao.examintion;

import java.util.LinkedList;
import java.util.Queue;

/**
 * 1、層次遍歷重建二叉樹
 * 2、尋找二叉樹的最近祖先
 *
 * 尋祖問宗
 * 時間限制:C/C++語言 1000MS;其他語言 3000MS
 * 內(nèi)存限制:C/C++語言 65536KB;其他語言 589824KB
 * 題目描述:
 * 姓氏是人的符號標(biāo)志,是家族血脈的傳承;族譜是家族血脈傳承的文字記載。同姓的兩個中國人,根據(jù)族譜或許能夠查出上面幾代內(nèi)是同一個祖先。
 * 查一下族譜,也許當(dāng)代某位同姓名人就是你的遠(yuǎn)房親戚,驚喜不驚喜,意外不意外!??!
 *
 * 輸入
 * 二元查找樹(
 * 1.若左子樹不空,左子樹值都小于父節(jié)點;
 * 2.如右子樹不空,右子樹值都大于父節(jié)點;
 * 3.左、右子樹都是二元查找樹;
 * 4. 沒有鍵值相等的節(jié)點)上任意兩個節(jié)點的值,請找出它們最近的公共祖先。
 * 輸入三行行,第一行為樹層級,第二行為數(shù)節(jié)點(其中-1表示為空節(jié)點),第
 * 三行為需要查找祖先的兩個數(shù)。
 * 在例圖中(虛線框沒有真實節(jié)點,為了輸入方便對應(yīng)位置輸-1)查找12和20的最近公共祖先輸入為:
 * 4
 * 9 6 15 2 -1 12 25 -1 -1 -1 -1 -1 -1 20 37
 * 12 20
 * 輸出
 * 輸出給出兩個數(shù)在樹上的最近公共祖先數(shù)值,如果沒有公共祖先,輸出-1;如果其中一個節(jié)點是另一個節(jié)點的祖先,
 * 輸出這個祖先點(如例圖中找15、20最近公共祖先,輸出15);如果輸入無效,輸出-1。
 *
 * 樣例輸入
 * 4
 * 9 6 15 2 -1 12 25 -1 -1 -1 -1 -1 -1 20 37
 * 12 20
 * 樣例輸出
 * 15
 */
public class Code_05_RebuildBTreeByLevel_And_FindLowestCommonAncestor {
    public static class Node {
        public int value;
        public Node left;
        public Node right;

        public Node(int data) {
            this.value = data;
        }
    }

    /**
     * 根據(jù)層次遍歷重建二叉樹
     */
    public static Node creatBinTree(int[] arr) {
        LinkedList<Node> list = new LinkedList<>();
        for (int i = 0; i < arr.length; i++) {
            list.add(arr[i] == -1 ? null : new Node(arr[i]));
        }
        Node head = list.get(0);
        for (int i = 0; i < arr.length / 2 - 1; i++) {
            if (list.get(i) != null) {
                list.get(i).left = list.get(i * 2 + 1);
                list.get(i).right = list.get(i * 2 + 2);
            }
        }
        int i = arr.length / 2 - 1;
        list.get(i).left = list.get(i * 2 + 1);
        if (arr.length % 2 == 1) {
            list.get(i).right = list.get(i * 2 + 2);
        }
        return head;
    }

    /**
     * 層次遍歷二叉樹
     * 隊列實現(xiàn)
     */
    public static void levelTraverse(Node node) {
        if (node == null) return;
        Queue<Node> queue = new LinkedList<>();
        queue.add(node);
        while (!queue.isEmpty()) {
            Node tmp = queue.poll();
            System.out.print(tmp.value + " ");
            if (tmp.left != null) queue.add(tmp.left);
            if (tmp.right != null) queue.add(tmp.right);
        }
    }

    /**
     * 二叉樹尋找最近祖先
     * @param head
     * @param o1
     * @param o2
     * @return
     */
    public static Node lowestAncestor(Node head, Node o1, Node o2) {
        if (head == null || head.value == o1.value || head.value == o2.value)
            return head;
        Node left = lowestAncestor(head.left, o1, o2);
        Node right = lowestAncestor(head.right, o1, o2);
        if (left != null && right != null)
            return head;
        return left != null ? left : right;
    }

    public static void main(String[] args) {

        // for test :層次遍歷重建二叉樹
        int[] arr = {9, 6, 15, 2, -1, 12, 25, -1, -1, -1, -1, -1, -1, 20, 37};
        Node node = creatBinTree(arr);
        printTree(node);
        levelTraverse(node);
        System.out.println();

        // for test : 二叉樹尋找最近祖先
        int[] arr2 = {1,2,3,4,5,6,7};
        Node node2 = creatBinTree(arr2);
        System.out.println(node2.value);
        printTree(node2);
        Node node1 = lowestAncestor(creatBinTree(arr2), new Node(4), new Node(6));
        System.out.println(node1.value);
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容