题目描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
(实际题目给的是二叉树中的一个结点,给出该结点的下一个结点)
解题思路
一棵树中,给定其中的一个结点,我们分别分析下,在中序遍历条件下,该结点的下一个结点在哪:
(建议大家画图理解下)
因为是中序遍历,该结点的左子树部分肯定在结点前遍历完成,所以不用考虑该结点的左结点。
考虑下该结点的右结点:
若右结点不为空
中序遍历下,该节点的下一个结点是其右子树的最左侧结点
若右结点为空
表示以该结点为根的部分遍历结束,需要回到其上一层根节点。
如果其是父节点左孩子,那么父节点就是下一个节点 ; 若是父节点的右孩子,则找他的父节点的父节点的父节点...直到当前结点是其父节点的左孩子。
(建议随便画一个二叉树,写出中序遍历,然后从二叉树中找符合情况的结点,对着代码思考)
题解
public TreeLinkNode GetNext(TreeLinkNode pNode)
{
// 1. 空 没啥好说的
if (pNode == null) return null;
// 2. 若其右子树不空
if (pNode.right != null){
pNode = pNode.right;
while (pNode.left!=null){
pNode = pNode.left;
}
return pNode;
}
// 3. 这是建立在右子树为空的基础上,
while (pNode.next != null){
// 条件是 父节点的左子结点是其本身,若不是继续父节点遍历
if (pNode.next.left == pNode) return pNode.next;
pNode = pNode.next;
}
// 4、建立再 父节点的父节点...的父节点为空,实际上回溯到根上了,
// 那么该结点就是 尾结点 下一个就是Null
return null;
}