思路分享:
一、有右子树时,就是右子树的最左结点
二、无右子树时,分为两种情况
1、结点的父节点为空,则为根节点,所以没有下一个结点
2、结点的父节点不为空
(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;
//无右子树,判断节点的父节点是否为空
} else if (pNode.next != null) {
while (pNode.next != null && pNode == pNode.next.right)
pNode = pNode.next;
pNode = pNode.next;
}else{
pNode=null;
}
return pNode;
}
}
总结:1、写代码的时候一定要加上边界值的判断,我因为指针为空的问题报错了好几次。
(1)入口边界值的判断
(2)寻找指针过程中边界值的判断。
2、&&与运算的先后顺序问题:从前往后计算,注意先后顺序
//这样写是对的
while (pNode.next != null && pNode == pNode.next.right)
//这样写就会抛出空指针异常
while (pNode == pNode.next.right && pNode.next != null)
2、多画几层二叉树来找规律。我第一次只画了三层二叉树,导致规律都是不对的,这真的是密之尴尬。当时以为右子树为空的时候,该结点为右孩子就是根节点,但是如果画4层就可以知道并不是这样。
3、分析之后把相同的归类,我开始分析的时候是把有右结点的分为:是父节点的左孩子和右孩子两种情况,分析到最后代码可以合并,显得比较简洁。
如下图:如果图片不能显示,代码如下
if(pNode.next!=null){
//此处对于左右孩子两种情况,写代码的时候可以合并
if (pNode == pNode.next.left) {
pNode = pNode.next;
}else if (pNode == pNode.next.right) {
while (pNode.next != null && pNode == pNode.next.right) {
pNode = pNode.next;
}
pNode=pNode.next;
}
}