Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >二叉树常见面试题

二叉树常见面试题

作者头像
河马嘴不大
发布于 2022-12-24 04:19:05
发布于 2022-12-24 04:19:05
22200
代码可运行
举报
运行总次数:0
代码可运行
重建二叉树

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。

例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function reConstructBinaryTree(pre, vin) {
    if (!pre || pre.length === 0) {
        return;
    }
    var treeNode = {
        val: pre[0]
    }
    for (var i = 0; i < pre.length; i++) {
        if (vin[i] === pre[0]) {
            treeNode.left = reConstructBinaryTree(pre.slice(1, i + 1), vin.slice(0, i));
            treeNode.right = reConstructBinaryTree(pre.slice(i + 1), vin.slice(i + 1));
        }
    }
    return treeNode;

}
树的子结构

输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function HasSubtree(pRoot1, pRoot2) {
    if (!pRoot1 || !pRoot2) {
        return false;
    }
    return isSubtree(pRoot1, pRoot2) || HasSubtree(pRoot1.left, pRoot2) || HasSubtree(pRoot1.right, pRoot2);
}

function isSubtree(root1, root2) {
    if (!root2) {
        return true;
    }
    if (!root1) {
        return false;
    }
    if (root1.val == root2.val) {
        return isSubtree(root1.left, root2.left) &&
            isSubtree(root1.right, root2.right);
    } else {
        return false;
    }
}
二叉树的镜像

操作给定的二叉树,将其变换为源二叉树的镜像。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function Mirror(root) {
    if (root === null) {
        return;
    }
    var temp = root.left;
    root.left = root.right;
    root.right = temp;
    Mirror(root.left);
    Mirror(root.right);
}
从上往下打印二叉树

从上往下打印出二叉树的每个节点,同层节点从左至右打印。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function PrintFromTopToBottom(root) {
    var arr = [];
    var data = [];
    if (root != null) {
        arr.push(root);
    }
    while (arr.length != 0) {
        var node = arr.shift();
        if (node.left != null) {
            arr.push(node.left);
        }
        if (node.right != null) {
            arr.push(node.right);
        }
        data.push(node.val);
    }
    return data;
}
二叉搜索树的后序遍历序列

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function VerifySquenceOfBST(sequence) {
    if (!sequence.length) {
        return false;
    }
    return adjustSquence(sequence, 0, sequence.length - 1);

}

function adjustSquence(sequence, start, end) {
    if (start >= end) {
        return true;
    }
    var i = start;
    while (i < end && sequence[i] < sequence[end]) {
        i++;
    }
    for (var j = i; j < end; j++) {
        if (sequence[j] < sequence[end]) {
            return false;
        }
    }
    return adjustSquence(sequence, start, i - 1) && adjustSquence(sequence, i, end - 1)
}
二叉树中和为某一值的路径

输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function FindPath(root, expectNumber) {
    var result = [];
    if (root === null) {
        return result;
    }
    dfsFind(root, expectNumber, [], 0, result);
    return result;

}

function dfsFind(root, expectNumber, path, currentSum, result) {
    currentSum += root.val;
    path.push(root.val);
    if (currentSum == expectNumber && root.left == null && root.right == null) {
        result.push(path.slice(0));
    }
    if (root.left != null) {
        dfsFind(root.left, expectNumber, path, currentSum, result);
    }
    if (root.right != null) {
        dfsFind(root.right, expectNumber, path, currentSum, result);
    }
    path.pop();
}
二叉树的深度

输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function TreeDepth(pRoot) {
    if (!pRoot) return 0;
    var left = 1 + TreeDepth(pRoot.left);
    var right = 1 + TreeDepth(pRoot.right);
    return Math.max(left, right)
}
平衡二叉树

输入一棵二叉树,判断该二叉树是否是平衡二叉树。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function TreeNode(x) {
    this.val = x;
    this.left = null;
    this.right = null;
}
var isBalanced = true;
function IsBalanced_Solution(pRoot) {
    if (pRoot == null) {
        return true;
    }
    IsBalanced(pRoot);
    var result = isBalanced;
    isBalanced = true;
    return result;
}
function IsBalanced(pRoot) {
    if (pRoot == null) {
        return 0;
    }
    var left = 0,
        right = 0;
    if (pRoot.left) {
        left = IsBalanced(pRoot.left);
    }
    if (pRoot.right) {
        right = IsBalanced(pRoot.right);
    }
    if (Math.abs(left - right) > 1) {
        isBalanced = false;
    }
    return left > right ? left + 1 : right + 1;
}
二叉树的下一个结点

给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function GetNext(pNode) {
    if (pNode == null) {
        return null;
    }
    var iNext = null;
    if (pNode.right != null) {
        var iRight = pNode.right;
        while (iRight.left != null) {
            iRight = iRight.left;
        }
        iNext = iRight;
    } else if (pNode.next != null) {
        var iCurrent = pNode,
            iParent = pNode.next;
        // 纪录一对结点,判断pNode是其父结点的左孩子还是右孩子
        while (iParent != null && iCurrent == iParent.right) {
            iCurrent = iParent; //沿父指针向上查找
            iParent = iCurrent.next;
        }
        // 直到找到某一结点是其父结点的左孩子,iNext就是该节点的父
        iNext = iParent;
    }
    return iNext;
}
对称的二叉树

请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function isSymmetrical2(root1, root2) {
    if (root1 == null && root2 == null) {
        return true;
    }
    if (root1 == null || root2 == null) {
        return false;
    }
    if (root1.val != root2.val) {
        return false;
    }
    return isSymmetrical2(root1.left, root2.right) && isSymmetrical2(root1.right, root2.left);
}

function isSymmetrical(pRoot) {
    return isSymmetrical2(pRoot, pRoot)
}
按之字形顺序打印二叉树

请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function Print(pRoot) {
    if (!pRoot) {
        return [];
    }
    var queue = [],
        result = [],
        flag = true;
    queue.push(pRoot);
    while (queue.length) {
        var len = queue.length;
        var tempArr = [];
        for (var i = 0; i < len; i++) {
            var temp = queue.shift();
            tempArr.push(temp.val);
            if (temp.left) {
                queue.push(temp.left);
            }
            if (temp.right) {
                queue.push(temp.right);
            }
        }
        if (!flag) {
            tempArr.reverse();
        }
        flag = !flag;
        result.push(tempArr);
    }
    return result;
}
把二叉树打印成多行

从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function Print(pRoot) {
    if (!pRoot) {
        return [];
    }
    var queue = [],
        result = [];
    queue.push(pRoot);
    while (queue.length) {
        var len = queue.length;
        var tempArr = [];
        for (var i = 0; i < len; i++) {
            var temp = queue.shift();
            tempArr.push(temp.val);
            if (temp.left) {
                queue.push(temp.left);
            }
            if (temp.right) {
                queue.push(temp.right);
            }
        }
        result.push(tempArr);
    }
    return result;
}
序列化二叉树

请实现两个函数,分别用来序列化和反序列化二叉树

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function TreeNode(x) {
    this.val = x;
    this.left = null;
    this.right = null;
}
var arr = [];
function Serialize(pRoot) {
    // write code here
    if (pRoot == null) {
        arr.push('a');
    } else {
        arr.push(pRoot.val);
        Serialize(pRoot.left);
        Serialize(pRoot.right);
    }

}
function Deserialize(s) {
    // write code here
    var node = null;
    if (arr.length < 1) {
        return null;
    }
    var number = arr.shift();
    if (typeof number == 'number') {
        node = new TreeNode(number);
        node.left = Deserialize(arr);
        node.right = Deserialize(arr);
    }
    return node;
}
二叉搜索树的第k个结点

给定一颗二叉搜索树,请找出其中的第k大的结点。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function Index() {
    this.index = 0;
}
function KthNode(pRoot, k) {
    if (pRoot === null) {
        return null;
    }
    let index = new Index();
    return Inorder(pRoot, k, index)
}
function Inorder(pRoot, k, index) {
    if (pRoot === null) {
        return null;
    }
    let node = Inorder(pRoot.left, k, index);
    if (node) return node;
    if (++index.index === k) {
        return pRoot;
    }
    node = Inorder(pRoot.right, k, index);
    if (node) return node;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-11-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java 17:和遗留 25 年的漏洞 Say Goodbye
Spring Framework 6 将采用 Java 17 和 Jakarta EE 9
逆锋起笔
2021/10/19
1.2K0
那些年,Kotlin 都截胡了哪些 Java 新特性
众所周知,Kotlin被称为最好的 Java。自 Kotlin 发布以来,凭借着其在 JVM 平台上惊人的兼容性,互操作性以及新特性支持,其迅速成为了广泛使用的 JVM 语言之一,就连 Google 也将 Kotlin 钦定为 Android 的首选开发语言。Kotlin 相对 Java 提供了非常多的特性,这些特性甚至截胡了某些 Java 即将推出的新特性,现在就让我们来盘点一下这些被 Kotlin “截胡” 的 Java 新特性吧…
HikariLan贺兰星辰
2022/11/14
8770
JDK15正式发布,划时代的ZGC同时宣布转正
2020年9月15日,JDK15正式发布,可谓如约而至。按照Java SE的发展路线图,JDK14自此停止更新。值得注意的是JDK15并非LTS版本,Oracle官方对Java SE的支持路线图如下:
YourBatman
2020/09/17
8910
JDK15正式发布,划时代的ZGC同时宣布转正
JDK的第三个LTS版本JDK17来了
2021年9月JDK17发布了,JDK17是最新的一个LTS版本。所谓LTS版本就是可以得到至少八年产品支持的版本。从2014年的JDK8,到2018年的JDK11,再到2021年的JDK17。
程序那些事
2021/11/15
1.6K0
Java 17 新功能介绍(LTS)
Java 17 在 2021 年 9 月 14 日正式发布,Java 17 是一个长期支持(LTS)版本,这次更新共带来 14 个新功能。
未读代码
2021/12/13
1.1K0
JDK17的新特性写法
JDK 17 是 Java Development Kit(Java 开发工具包)的一个版本,是 Oracle 公司提供的 Java SE(Java 平台,标准版)的一部分。以下是 JDK 17 的一些基本信息:
半月无霜
2023/11/19
8470
JDK17的新特性写法
Java 17 更新(7):模式匹配要支持 switch 啦
这一次我们来聊聊 JEP 406: Pattern Matching for switch (Preview)。这是一个预览特性。
bennyhuo
2021/10/19
3K0
Java 17 更新(7):模式匹配要支持 switch 啦
Java 17 更新(6):制裁!我自己私有的 API 你们怎么随便一个人都想用?
今天我们来聊聊 JEP 403: Strongly Encapsulate JDK Internals。这一条对于使用 JDK 内部 API 的应用场景来讲会比较受影响。
bennyhuo
2021/10/19
1.8K0
Java 17 更新(6):制裁!我自己私有的 API 你们怎么随便一个人都想用?
Java9-Java17新特性
​ 因为编程语言千千万,他们就像一个生态系统一样,新的语言会出现,旧的语言会被取代,除非它不断地演变,能跟上节奏;同理,Java也是取代了竞争对手语言,且根据编程市场不断演变才能一直存活的。
yuanshuai
2023/11/17
6910
Java9-Java17新特性
Java 17 更新(2):没什么存在感的 strictfp, 这回算是回光返照了
我们今天聊的内容来自于 JEP 306: Restore Always-Strict Floating-Point Semantics。看到这个提案的标题的时候,我就知道很多人懵了。这玩意历史感太强了,说实话我也没怎么接触过。
bennyhuo
2021/09/29
1.7K0
Java14来了!Switch竟如此简单?Lombok也不需要了?来用Idea搭建Java14吧!
Java 14 在 2020.3.17 日发布正式版了,但现在很多公司还在使用 Java 7 或 Java 8,每当看到 Java 又发布新版本心里就慌得一匹。不过此版本并不是 LTS (长期支持版) 版本,所以不要慌,我们先来了解一下好了,等 LTS 版本发布后再用也不迟。
磊哥
2020/03/22
1.1K0
Java14来了!Switch竟如此简单?Lombok也不需要了?来用Idea搭建Java14吧!
这年头,能坐上火箭的东西不多啊!Java版本号算一个!
Sun早已经不在了,如今只剩Oracle,也就是Java目前的抚养人。从2019年4月16号开始,Oracle版本的JDK,已经宣布收费,目前有更多的企业转向OpenJDK。
xjjdog
2021/12/13
4170
Java 17 更新(8):密封类终于转正
我们书接上回,继续聊 Java 17 的更新。这篇我们介绍一下 JEP 409: Sealed Classes。
bennyhuo
2021/10/19
1.6K0
Java 17 更新(8):密封类终于转正
JDK的版本迭代(JDK9 - JDK20)
这意味着Java的更新从传统的以特性驱动的发布周期,转变为以时间驱动的发布模式,并且承诺不会跳票。通过这样的方式,开发团队可以把一些关键特性尽早合并到 JDK 之中,以快速得到开发者反馈,在一定程度上避免出现像 Java 9 两次被迫延迟发布的窘况。
鱼找水需要时间
2023/05/11
1.8K0
JDK的版本迭代(JDK9 - JDK20)
Java 17 新特性,快到起飞?惊呆了!
本书最新版,主要更新了在JDK 17发布的的新特性,JDK 17是继JDK11之后的一个新的长期支持版本,免费使用至2024年9月,同时会持续更新到2029年9月。下面就一起来看看,到底更新了些什么内容:
公众号:大数据羊说
2022/07/07
1.5K0
Java 17 新特性,快到起飞?惊呆了!
拥抱变化,面向Java17,Java8-18全系列特性详解
当我们大部分Javaer还沉浸在Java 8 的特性中时,Java 19 预计在2022年9月20号发布,现在半年发布一次的节奏真让人应接不暇,况且Spring Boot 3.0开始最低版本为Java 17,Spring Security、KafKa等也都宣布在后期版本最低需要Java 17 ,所以我们恶补一下Java 8-18的特性很有必要。
阿提说说
2022/11/18
2.6K0
拥抱变化,面向Java17,Java8-18全系列特性详解
如约而至,Java 10 正式发布!
3 月 20 日,Oracle 宣布 Java 10 正式发布。 官方已提供下载:http://www.oracle.com/technetwork/java/javase/downloads/ind
程序员十三
2018/03/30
7550
如约而至,Java 10 正式发布!
继 SpringBoot 3.0,Elasticsearch8.0 官宣:拥抱 Java 17
新版任你发,我用 Java 8,这可能是当下 Java 开发者的真实写照。不过时代可能真的要抛弃 Java 8,全面拥抱 Java 17 了。
jinjunzhu
2022/09/23
1K0
继 SpringBoot 3.0,Elasticsearch8.0 官宣:拥抱 Java 17
Java17,有史以来最快 JDK
都说Java 8 是YYDS,那你注意到 Java 17 已经正式发布了吗?目前Java 18 也已经进入早期开发阶段。
程序员小猿
2021/10/12
2K0
300 秒快速了解 Java 9 - 16 新特性
Java 这几年的更新实在是太太太……快了,Java 8 都还没用多久,16 都已经发布了。自从 Java 8 发布了 Lambda 和 Stream 之后,Java 就像打了鸡血一样,半年一个版本的发布,生产队的驴也没这么勤快。
肉眼品世界
2021/09/27
4870
300 秒快速了解 Java 9 - 16 新特性
推荐阅读
相关推荐
Java 17:和遗留 25 年的漏洞 Say Goodbye
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验