题目描述:
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
思路分析:
根据中序遍历的特点分析即可。
1.首先分析节点的右子树,若存在找到该右子树的最左端的节点返回即可。
2.若不存在,这时候需要根据父节点来判断了,若该节点是父节点的左节点,则该节点中序遍历的下个节点就是其父节点;若该节点是父节点的右节点,则需要依次向上找出该节点所在的最近的左子树的父节点即可。
代码实现如下:
/*
public class TreeLinkNode {
int val;
TreeLinkNode left = null;
TreeLinkNode right = null;
TreeLinkNode next = null;
TreeLinkNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public TreeLinkNode GetNext(TreeLinkNode pNode)
{
if(pNode == null){
return null;
}
//根据中序遍历的特点先判断该节点的右节点情况
if(pNode.right != null){
//该节点的中序遍历的下一个节点是右子树最左端的节点
pNode = pNode.right;
while(pNode.left != null){
pNode = pNode.left;
}
return pNode;
}
//当右节点为空时需要判断该节点是其父节点的左节点还是右节点
else{
TreeLinkNode parents = pNode.next;
while(parents != null){
if(pNode == parents.left){
return parents;
}
pNode = parents;
parents = parents.next;
}
return parents;
}
}
}