一、题目解析
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
该题一共三种情况:
(1)结点如果右孩子存在,则设置一个指针从该节点的右孩子出发,找到右孩子的最左结点即可。
(2)如果右孩子不存在,则判断是否存在父节点;如果该节点是父节点的左孩子节点则直接返回父节点,否则继续向上遍历其父节点的父节点,同时依次判断遍历的节点是否是父节点的左孩子节点。
(3)其余的情况返回空即可。
二、代码
public class Solution {
public TreeLinkNode GetNext(TreeLinkNode pNode)
{
//右孩子节点存在,则从右孩子节点开始找到最左结点
if(pNode.right!=null){
TreeLinkNode node = pNode.right;
while(node.left!=null){
node=node.left;
}
return node;
}else if(pNode.right==null&&pNode.next!=null){
//不存在右孩子节点,存在父节点
TreeLinkNode node = pNode.next;
while(node!=null){
//判断该节点是否是父节点的左孩子
if(node.left==pNode)
return node;
pNode=node;
node = node.next;
}
}
return null;
}
}
三、总结
注意第二种情况,需要依次判断该节点的父节点和其的关系,满足条件时返回即可。