题目描述
给定一个二叉树和其中的一个结点A,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
思路
中序遍历:先遍历左孩子,然后根节点,然后右孩子
1)节点A有右子树,那么它的下一个节点就是它右子树的最左边的节点。
2)节点A没有右子树,那么我们就要向上遍历,知道找到一个节点B,这个节点B是它父节点的左孩子,则这个B节点的父节点就是节点A的下一个节点;如果一直向上遍历,直到遍历到了根节点,则表示这个节点A没有下一个节点
代码
public class TreeLinkNode {
int val;
TreeLinkNode left = null;
TreeLinkNode right = null;
TreeLinkNode next = null;
TreeLinkNode(int val) {
this.val = val;
}
}
public TreeLinkNode GetNext(TreeLinkNode pNode)
{
// 空二叉树
if(pNode == null){
return null;
}
// 仅有父节点的空二叉树
if(pNode.left == null && pNode.right == null){
return null;
}
if(pNode.right != null){ // 这个节点有右子树,它的下一个节点是右子树的最左边的节点
TreeLinkNode rightNode = pNode.right;
while(rightNode.left != null){
rightNode = rightNode.left;
}
return rightNode;
}
// 这个节点没有右子树的情况
while(pNode.next != null){
if(pNode == pNode.next.left){
return pNode.next;
}
pNode = pNode.next;
}
return null;
}