首页 > 试题广场 >

在二叉树中找到一个节点的后继节点

[编程题]在二叉树中找到一个节点的后继节点
  • 热度指数:2895 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
二叉树中一个节点的后继节点指的是,二叉树的中序遍历的序列中的下一个节点。

输入描述:
第一行输入两个整数 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

备注:

3 1
1 2 3
3 0 0
2 0 0
3
第21个用例给的不对,应该是
3 1
1 2 3
2 0 0
3 0 0
3
就这一个用例,我得重写生成二叉树的代码,佛了
发表于 2022-02-16 10:57:37 回复(0)
中序遍历时用一个prev变量记录前一个节点的值,当这个值与询问节点值相等时,当前遍历到的节点就是要求的后继节点。
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.Stack;
import java.util.HashMap;

class TreeNode {
    public int val;
    public TreeNode left;
    public TreeNode right;
    public TreeNode(int val) {
        this.val = val;
        this.left = null;
        this.right = null;
    }
}

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] params = br.readLine().trim().split(" ");
        int n = Integer.parseInt(params[0]), rootVal = Integer.parseInt(params[1]);
        // 先建树
        TreeNode root = new TreeNode(rootVal);
        HashMap<Integer, TreeNode> map = new HashMap<>();
        map.put(root.val, root);
        for(int i = 0; i < n; i++){
            params = br.readLine().split(" ");
            int val = Integer.parseInt(params[0]);
            int leftVal = Integer.parseInt(params[1]);
            int rightVal = Integer.parseInt(params[2]);
            TreeNode node = map.get(val);
            if(leftVal != 0) {
                node.left = new TreeNode(leftVal);
                map.put(leftVal, node.left);
            }
            if(rightVal != 0) {
                node.right = new TreeNode(rightVal);
                map.put(rightVal, node.right);
            }
        }
        // 中序遍历
        int query = Integer.parseInt(br.readLine());
        int prev = -1, res = 0;
        Stack<TreeNode> stack = new Stack<>();
        while(!stack.isEmpty() || root != null){
            while(root != null){
                stack.push(root);
                root = root.left;
            }
            if(!stack.isEmpty()){
                root = stack.pop();
                if(prev == query){
                    // 前一个节点为询问节点了,当前节点为后继节点
                    res = root.val;
                    break;
                }
                prev = root.val;
                root = root.right;
            }
        }
        System.out.println(res);
    }
}

发表于 2021-11-16 11:47:35 回复(0)

问题信息

上传者:小小
难度:
3条回答 8484浏览

热门推荐

通过挑战的用户

查看代码
在二叉树中找到一个节点的后继节点