前言:
这次代码写出来,一次通过,且没有空指针异常,很开心。时刻警醒注意,是否排除了空指针异常的情况
后面贴了两个代码,第二个是我看评论区的代码时,发现大佬们的代码更为简洁,相比较而言,大佬们在合适的位置返回值。值得学习,代码更少,条例更好。
- 题目:
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
- 思路:(建议画个超大的图,好好琢磨下,把各个结点试一下就了然了)中序遍历的输出顺序是,“左根右”,如果左、右里又各有子树,又分为“左根右”。所以得到给定这个结点的时候,我们得判断它是否包含子数。包含右子树,则说明它是根(左子树不用管,下一个结点一定不是在左子树里),根的下一个结点,就在它的右子树里,如果它的右子树还有左子树,那么一直找到最左边即使,否则,下一个结点就是它这个右子树结点。如果,给定这个结点,不包含右子树,我们得判断它是其父结点的左子孩子还是右孩子。是左孩子,则返回父结点。是右孩子,则一直往上找,重复这一步的判断,直到是父节点的左孩子。就这样分情况讨论。同时,依旧时刻注意是否右空指针异常。
- 代码:
class Solution {
public TreeLinkNode GetNext(TreeLinkNode pNode)
{
TreeLinkNode temp=null;//临时结点
TreeLinkNode result=null;//结果
if(pNode.right!=null){//包含右子树,则说明是根结点,则往左一直找
temp=pNode.right;
while(temp.left!=null){
temp=temp.left;
}
result=temp;
}else{//不包含右子树,则看它是父结点的左子树还是右子树
temp=pNode.next;
if(temp!=null&&temp.left==pNode){//是左
result=temp;
}else if(temp!=null){//是右
while(temp.next!=null&&temp.next.right==temp){
temp=temp.next;
}
result=temp.next;
}
}
return result;
}
}
class TreeLinkNode {
int val;
TreeLinkNode left = null;
TreeLinkNode right = null;
TreeLinkNode next = null;
TreeLinkNode(int val) {
this.val = val;
}
}
public class Solution {
TreeLinkNode GetNext(TreeLinkNode node) {
if(node==null) return null;
if(node.right!=null){ //如果有右子树,则找右子树的最左节点
node = node.right;
while(node.left!=null) node = node.left;
return node;
}
while(node.next!=null){
//没右子树,则找第一个当前节点是父节点左孩子的节点
if(node.next.left==node) return node.next;
node = node.next;
}
return null; //退到了根节点仍没找到,则返回null }}