博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在二叉树中找到一个节点的后继节点
阅读量:4166 次
发布时间:2019-05-26

本文共 3104 字,大约阅读时间需要 10 分钟。

二叉树中一个节点的后继节点指的是,二叉树的中序遍历的序列中的下一个节点。

链接:https://www.nowcoder.com/questionTerminal/c37ec6a9e4084b9c943be2d3a369e177

来源:牛客网

输入描述: 第一行输入两个整数 n 和 root,n 表示二叉树的总节点个数,root 表示二叉树的根节点。

以下 n 行每行四个整数 fa,lch,rch,表示 fa 的左儿子为 lch,右儿子为 rch。(如果 lch 为 0 则表示 fa

没有左儿子,rch同理)

最后一行输入要询问的节点 node。

输出描述: 输出一个整数表示答案。(如果 node 是最后一个节点,则输出 0 ) 示例1 输入

10 6
6 3 9
3 1 4
1 0 2
2 0 0
4 0 5
5 0 0
9 8 10
10 0 0
8 7 0
7 0 0
10
输出 0

import java.util.HashMap;import java.util.Map;import java.util.Scanner;public class Main {
public static void main(String[] args) {
Map
map = new HashMap<>(); Map
parent = new HashMap<>(); /** * 读取数据 */ Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); TreeNode root = new TreeNode(scanner.nextInt()); map.put(root.val, root); scanner.nextLine(); for (int i = 0; i < n; i++) {
int val = scanner.nextInt(); TreeNode node; if (!map.containsKey(val)) {
node = new TreeNode(val); map.put(node.val, node); } else {
node = map.get(val); } int left = scanner.nextInt(); if (left != 0) {
node.left = new TreeNode(left); map.put(left, node.left); parent.put(left, node); } else {
node.left = null; } int right = scanner.nextInt(); if (right != 0) {
node.right = new TreeNode(right); map.put(node.right.val, node.right); parent.put(right, node); } else {
node.right = null; } node.parent = parent.get(node.val); } Integer target = scanner.nextInt(); /** * 找到 target 的下一个节点 */ int result = 0; TreeNode node = map.get(target); if (node.right != null) {
// target有右子树:下一个节点就是右子树的最左节点 node = node.right; while (node.left != null) {
node = node.left; } result = node.val; } else if (node.parent.left == node) {
// target没有右子树 且 target是其父节点的左子树:后继节点就是target的父节点 result = node.parent.val; } else {
// target没有右子树 且 target是其父节点的右子树:找到第一个使target在左子树的祖先节点 node = node.parent; while (node.parent != null && node != node.parent.left) {
node = node.parent; } result = node.parent.val; // target是最后一个节点 if (node.parent == root) {
result = 0; } } System.out.println(result); }}class TreeNode {
int val; TreeNode left; TreeNode right; TreeNode parent; public TreeNode(int val) {
this.val = val; } @Override public String toString() {
return "TreeNode{" + "val=" + val + ", left=" + left + ", right=" + right + "}\n"; }}

转载地址:http://rgrxi.baihongyu.com/

你可能感兴趣的文章
盘点这些年我出的书,以及由此得到的收获
查看>>
用Python的Pandas和Matplotlib绘制股票KDJ指标线
查看>>
面试必问:对java多线程里Synchronized的思考
查看>>
最近接了本分布式组件面试书的选题,请大家一起来提意见
查看>>
Redis整合MySQL和MyCAT分库组件(来源是我的新书)
查看>>
Java程序员普遍存在的面试问题以及应对之道(新书第一章节摘录)
查看>>
程序员高效出书避坑和实践指南
查看>>
计算机方面毕业生怎样写简历
查看>>
从软件公司的异同点讲起,聊聊未来的程序员该如何选公司和谋规划
查看>>
我不想安于当前的限度,以达到所谓的幸福,回顾下2020年的我
查看>>
如何在面试中介绍自己的项目经验(面向java改进版)
查看>>
通过写n本书的积累,我似乎找到了写好技术文章的方法(回复送我写的python股票电子书)
查看>>
如果很好说出finalize用法,面试官会认为你很资深
查看>>
Java面试官经验谈:如何甄别候选人真实的能力,候选人如何展示值钱技能
查看>>
分析若干没面试机会和没体现实力的简历
查看>>
用python的matplotlib和numpy库绘制股票K线均线
查看>>
以互联网公司的经验告诉大家,架构师究竟比高级开发厉害在哪?
查看>>
GanttProject 使用的控件第三方包:jdnc-modifBen.jar
查看>>
ps、grep和kill联合使用杀掉进程
查看>>
openfire中的mina框架使用
查看>>