二叉树中一个节点的后继节点指的是,二叉树的中序遍历的序列中的下一个节点。
链接: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<Integer, TreeNode> map = new HashMap<>();
Map<Integer, TreeNode> 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";
}
}