剑指offer_二叉树的的下一结点
题目:输入二叉树的某一个结点,查找出此二叉树当前结点中序遍历输出的下一结点,每一个结点不仅包含左指针和右指针,还
包含指向父结点的指针。
思路:分一下四种情况
1.当前结点为空,则下一输出结点为空
2.当前结点有右子树,根据中序遍历的特点可知,下一输出结点为当前结点的右子树的最左子节点。
3.当前结点没有右子树,且当前结点的父结点存在,当前结点为父结点的左结点,则下一输出结点为当前结点的父结点;
4..当前结点没有右子树,且当前结点的父结点存在,而当前结点为父结点的右结点,可以想象当前结点为整个二叉树中某一个结点的
右子树的最后一个输出的结点,所以往上遍历,知道找到一个结点为父结点的左子结点的结点,则此结点的父结点为我们想要找的结点。
代码如下:注:next 为指向父结点的指针
/*
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 if(pNode.next!=null&&pNode.next.left==pNode){
//当前结点没有右子树且为父结点的左结点,则中序遍历的下一结点为当前结点的父结点
return pNode.next;
}else if(pNode.next!=null&&pNode==pNode.next.right){
//1.当前结点没有右子树且当前结点为父结点的右子结点
//2.往上遍历,直到找到一个结点是父结点的左子结点的结点
while(pNode.next!=null&&pNode==pNode.next.right){
pNode=pNode.next;
}
return pNode.next;
}else{
return null;
}
}
}