剑指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;
                                             }

                             }
                   }

posted @ 2018-01-18 13:07  大熊好好写代码  阅读(125)  评论(0编辑  收藏  举报