二叉树的下一个节点
题目:
给定一棵二叉树和其中的一个节点,如何找出中序遍历序列的下一个节点?树中的节点除了有两个分别指向左右节点的指针,还有一个指向父节点的指针
思路:
针对于中序遍历,具体做法是先遍历左子树,然后再遍历根节点,最后遍历右子树。
我们在判断下一个节点的时候大概是这样一个思路,如果该节点有右子节点的话,进入右子树,然后遍历右子树的最左边的一个节点;
如果给定的节点没有右子树,那么就需要往根节点查找,这个时候需要考虑两种情况,如果给定的结点是一个右节点,这个时候我们所找到的父节点已经被遍历过,因此我们需要继续往上遍历,直到找到一个节点未左子节点,这样的节点的父节点就没有被遍历过,这个时候返回该父节点,就是我们所找的下一个节点。
代码:
public TreeLinkNode GetNext(TreeLinkNode pNode){
if(pNode == null)
return null;
TreeLinkNode res = null;//定义结果
//判断条件1,如果有右子节点,直接遍历右子节点的最左的节点
if(pNode.right != null){
TreeLinkNode p = pNode.right;
while(p.left!=null){
p = p.left;
}
res = p;
}
//判断条件二,如果没有右子节点
else if(pNode.next != null){//判断父节点是否为空
TreeLinkNode p = pNode.next;//找到该点的父节点
TreeLinkNode currentNode = pNode;
//情况一,pNode这个节点刚好为一个左子节点
//情况二,pNode这个节点是一个右子节点,那么向上递归直到找到一个节点为左子节点
while(p != null && currentNode == p.right){
currentNode = p;
p = p.next;
}
res = p;
}
return res;
}