剑指offer java版 test57——找出二叉树给定结点的下一结点

前言:
这次代码写出来,一次通过,且没有空指针异常,很开心。时刻警醒注意,是否排除了空指针异常的情况

后面贴了两个代码,第二个是我看评论区的代码时,发现大佬们的代码更为简洁,相比较而言,大佬们在合适的位置返回值。值得学习,代码更少,条例更好。

  1. 题目

给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。

  1. 思路:(建议画个超大的图,好好琢磨下,把各个结点试一下就了然了)中序遍历的输出顺序是,“左根右”,如果左、右里又各有子树,又分为“左根右”。所以得到给定这个结点的时候,我们得判断它是否包含子数。包含右子树,则说明它是根(左子树不用管,下一个结点一定不是在左子树里),根的下一个结点,就在它的右子树里,如果它的右子树还有左子树,那么一直找到最左边即使,否则,下一个结点就是它这个右子树结点。如果,给定这个结点,不包含右子树,我们得判断它是其父结点的左子孩子还是右孩子。是左孩子,则返回父结点。是右孩子,则一直往上找,重复这一步的判断,直到是父节点的左孩子。就这样分情况讨论。同时,依旧时刻注意是否右空指针异常。
  2. 代码:

 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    }}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值