牛客
简单暴力解法,从当前节点已知回溯到根节点,在由根节点中序遍历整个树,用 list 记录下来,最后在 list 中查找 pNode 的下一个节点
import java. util. *;
public class Solution {
public ArrayList< TreeLinkNode> list = new ArrayList < > ( ) ;
public TreeLinkNode GetNext ( TreeLinkNode pNode)
{
TreeLinkNode root = null, tmp = pNode;
while ( tmp != null) {
root = tmp;
tmp = tmp. next;
}
inOrder ( root) ;
for ( int i = 0 ; i < list. size ( ) ; i++ ) {
if ( list. get ( i) == pNode && i + 1 != list. size ( ) )
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) ;
}
}
画一颗二叉树,写出中序遍历结果,分析每个节点与其下一个节点的关系,然后分类讨论,参考1 参考2
public TreeLinkNode GetNext ( TreeLinkNode pNode) {
if ( pNode. right != null) {
TreeLinkNode node = pNode. right;
while ( node. left != null)
node = node. left;
return node;
} else {
while ( pNode. next != null) {
TreeLinkNode parent = pNode. next;
if ( parent. left == pNode)
return parent;
pNode = pNode. next;
}
}
return null;
}