题目描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
分析
步骤如下:
(1) 若该节点存在右子树:则下一个节点为右子树最左子节点;
(2) 若该节点不存在右子树:这时又细分两种情况:
2-1: 该节点为父节点的左子节点,则下一个节点为其父节点
2-2: 该节点为父节点的右子节点,则沿着父节点向上遍历,知道找到一个节点的父节点的左子节点为该节点,则该节点的父节点下一个节点
注意:父节点指针是next,left、right指向左右孩子
图解如下:
public class Solution {
public TreeLinkNode GetNext(TreeLinkNode pNode)
{
if(pNode == null){
return null;
}
//三种情况,注意:next是表示父结点
//1、右孩子不为空
if(pNode.right != null){
pNode = pNode.right;//先走向右孩子
while(pNode.left != null){
pNode = pNode.left;
}
return pNode;
}
//2、右孩子为空,细分两种情况
while(pNode.next != null){//父节点不为空,即不是根节点
//2-1、是根节点的左孩子
if(pNode.next.left == pNode){
return pNode.next; //父节点即为下一个结点
}
//2-2、非左孩子,向上找父节点,重复此过程
pNode = pNode.next;
}
return null;
}
}