题目描述
二叉树中一个节点的后继节点指的是,二叉树的中序遍历的序列中的下一个节点。
输入描述:
第一行输入两个整数 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.io.*;
import java.util.*;
public class Main{
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] info = br.readLine().trim().split(" ");
int len = Integer.parseInt(info[0]);
int r = Integer.parseInt(info[1]);
TreeNode[] nodes = new TreeNode[len+1];
for(int i=1;i<=len;i++){
nodes[i] = new TreeNode(i);
}
createTree(nodes,br);
int index = Integer.parseInt(br.readLine());
TreeNode node = nodes[index];
findNext(node);
}
public static void findNext(TreeNode node){
if(node==null) return;
if(node.right!=null){
node = node.right;
while(node.left!=null){
node = node.left;
}
System.out.println(node.val);
return;
}
TreeNode parent = node.parent;
while(parent!=null&&parent.left!=node){
node = parent;
parent = parent.parent;
}
if(parent==null){
System.out.println(0);
}else{
System.out.println(parent.val);
}
}
public static void createTree(TreeNode[] nodes,BufferedReader br) throws Exception{
for(int i=0;i<nodes.length-1;i++){
String[] datas = br.readLine().trim().split(" ");
int data = Integer.parseInt(datas[0]);
int left = Integer.parseInt(datas[1]);
int right = Integer.parseInt(datas[2]);
if(left!=0){
nodes[data].left = nodes[left];
nodes[left].parent = nodes[data];
}
if(right!=0){
nodes[data].right = nodes[right];
nodes[right].parent = nodes[data];
}
}
return ;
}
}
class TreeNode{
TreeNode left;
TreeNode right;
TreeNode parent;
int val;
public TreeNode(int val){
this.val = val;
}
}