import java.util.*; public class Main { static class Node{ int value; Node left; Node right; public Node(int value) { this.value = value; } } /*如果对二叉搜索树进行中序排列(左根右),那么会得到一个从小到大的序列。 如果中序遍历时出现两次降序,第一个错误的节点为第一次降序时较大的节点,第二个错误的节点为第二次降序时较小的节点 如果中序遍历时出现一次降息,第一个错误的节点就是本次降序较大的节点,第二个错误的节点就是本次降序较小的节点 * */ public static Node[] getTwoErrNodes(Node head){ Node[] errs=new Node[2]; if(head==null){ return errs; } Stack<Node> stack=new Stack<Node>(); Node pre=null; //放入 根 左 //弹出 左 根 //放入 右 //弹出 右 while (!stack.isEmpty()|| head!=null){ if(head!=null){ stack.push(head); head=head.left; }else { head=stack.pop(); if(pre!=null &&pre.value>head.value){ errs[0]= errs[0]==null?pre:errs[0]; errs[1]=head; } pre=head; head=head.right; } } return errs; } public static Node createTree(Scanner in, int n){ int rootValue=in.nextInt(); Node root=new Node(rootValue); HashSet<Node> set=new HashSet<Node>(); set.add(root); //n行读取 for (int i = 0; i < n; i++) { int fatherValue= in.nextInt(); int leftValue=in.nextInt(); int rightValue=in.nextInt(); //遍历 for (Node e:set){ //1、比较节点 if(e.value==fatherValue){ //2、建立左右节点 Node left= leftValue==0?null:new Node(leftValue); Node right= rightValue==0?null:new Node(rightValue); e.left=left; e.right=right; //3、放入节点 if(leftValue!=0){ set.add(left); } if(rightValue!=0){ set.add(right); } //4、remove set.remove(e); break; } } } return root; } public static void main(String[] args) { Scanner in=new Scanner(System.in); int n=in.nextInt(); Node root=createTree(in,n); Node[] result=new Node[2]; result=getTwoErrNodes(root); System.out.println(result[1].value+" "+result[0].value); } }