import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
public class Solution8 {
public static void main(String[] args) {
TreeLinkNode root = new TreeLinkNode(1);
TreeLinkNode node1 = new TreeLinkNode(2);
TreeLinkNode node2 = new TreeLinkNode(3);
TreeLinkNode node3 = new TreeLinkNode(4);
TreeLinkNode node4 = new TreeLinkNode(5);
TreeLinkNode node5 = new TreeLinkNode(6);
TreeLinkNode node6 = new TreeLinkNode(7);
TreeLinkNode node7 = new TreeLinkNode(8);
TreeLinkNode node8 = new TreeLinkNode(9);
root.left = node1;
root.right = node2;
node1.next = root;
node2.next = root;
node1.left = node3;
node1.right = node4;
node3.next = node1;
node4.next = node1;
node2.left = node5;
node2.right = node6;
node5.next = node2;
node6.next = node2;
node4.left = node7;
node4.right = node8;
node7.next = node4;
node8.next = node4;
TreeLinkNode next = getNextTwo(node8);
System.out.println(next.val);
}
public static TreeLinkNode getNext(TreeLinkNode pNode) {
if (pNode == null){
return null;
}
if (pNode.right != null){
TreeLinkNode pRight = pNode.right;
while (pRight.left != null){
pRight = pRight.left;
}
return pRight;
}
if (pNode.next != null && pNode.next.left == pNode){
return pNode.next;
}
if (pNode.next != null){
TreeLinkNode parentNode = pNode.next;
while (parentNode.next != null && parentNode != parentNode.next.left){
parentNode = parentNode.next;
}
return parentNode.next;
}
return null;
}
public static TreeLinkNode getNextTwo(TreeLinkNode pNode) {
if (pNode == null){
return null;
}
TreeLinkNode root = pNode;
while (root.next != null){
root = root.next;
}
List<TreeLinkNode> list = new ArrayList<>();
Stack<TreeLinkNode> stack = new Stack<>();
TreeLinkNode cur = root;
while (cur != null || !stack.isEmpty()){
while (cur != null){
stack.push(cur);
cur = cur.left;
}
cur = stack.pop();
list.add(cur);
cur = cur.right;
}
for (int i = 0; i < list.size(); i++) {
if (list.get(i) == pNode){
return i == list.size() - 1 ? null : list.get(i+1);
}
}
return null;
}
}
class TreeLinkNode{
int val;
TreeLinkNode left = null;
TreeLinkNode right = null;
TreeLinkNode next = null;
TreeLinkNode(int val){
this.val = val;
}
}