1.本题知识点
二叉树
2. 题目描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
3. 思路
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190703135229166.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTI0MTUwMzU=,size_16,color_FFFFFF,t_70)
中序遍历:d,b,h,e,i,a,f,c,g
① 如果节点有右子树,它的下一个节点就是右子树的最左节点,比如a的下一个节点就是a.right.left = f,e的下一个节点就是e.right= i。
②如果节点没有右子树,且是它的父节点的左子节点,那么下一个节点就是它的父节点,比如 h.next = e。
③如果节点没有右子树,且是它的父节点的右子节点,那么下一个节点稍微有点复杂,需要往上遍历一直找到是它的父节点的左子节点的节点,比如i.next.next = b,b是左子节点,所以此时,b的父节点就是下一个节点。
注意:此题的关键就是以上3种情况都能考虑到,最好通过画图理解。
Java版本:
public class Solution {
public TreeLinkNode GetNext(TreeLinkNode pNode)
{
if(pNode == null) return null;
TreeLinkNode pNext = null;
if(pNode.right != null){
pNode = pNode.right;
while(pNode.left != null){
pNode = pNode.left;
}
pNext = pNode;
}
else if(pNode.next != null){
TreeLinkNode parent = pNode.next;
while(parent != null && pNode == parent.right){
pNode = parent;
parent = pNode.next;
}
pNext = parent;
}
return pNext;
}
}