思路:
找到根节点;
存储中序遍历的结果到List集合中;
遍历返回结点
/*
public class TreeLinkNode {
int val;
TreeLinkNode left = null;
TreeLinkNode right = null;
TreeLinkNode next = null;
TreeLinkNode(int val) {
this.val = val;
}
}
*/
import java.util.*;
public class Solution {
public List<TreeLinkNode> list;
//返回中序遍历的下一个结点
public TreeLinkNode GetNext(TreeLinkNode pNode) {
//思路:1.找到根节点; 2.存储中序遍历的结果到List集合中; 3.遍历返回结点
//定位根节点
TreeLinkNode root = pNode;
while(root.next != null) root = root.next;
//保存中序遍历的结果
list = new ArrayList<>();
inorder(root);
//返回结果
for(int i = 0; i < list.size() - 1;i++){
if(list.get(i) == pNode) return list.get(i+1);
}
return null;
}
public void inorder(TreeLinkNode root){
if(root == null) return;
inorder(root.left);
list.add(root);
inorder(root.right);
}
}
为什么要找根节点?直接从pNode开始不行吗?
实际上直接从pNode开始是能够通过一些测试用例的,但这种解法有漏洞,比如下面的这个例子:
(1)树的结构为:【5,4,#,3,#,2】
(2)给出的结点为:4
直接遍历以结点4为根的子树后,得到的下一个结点值为null
但是实际上,正确答案应该是5(中序-左根右),所以首先应该找到整棵树的根节点