剑指offer-----二叉树的下一个节点

1、题目描述

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

2、思想

当前结点有右子树:

                  下一个节点是右子树的最左节点。

当前结点没有右子树:

                   (1)当前结点是父节点的左子节点,下一个节点是父节点。

                    (2)当前结点是父节点的右子节点,上溯到第一个左子节点,下一个节点是第一个左子节点的父节点。

3、代码实现

/*
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 ;
         }
         TreeLinkNode pNext =  null ; //二叉树中给定节点的下一个节点
         if (pNode.right !=  null ){ //给定节点有右子树
             TreeLinkNode right = pNode.right;
             while (right.left !=  null ){ //下一个节点是右结点的最左子节点
                 right = right.left;
             }
             pNext = right;
         } else if (pNode.next !=  null ){ //给定节点没有右子树,但是给定节点的父节点不为空
             TreeLinkNode current = pNode;
             TreeLinkNode parent = pNode.next;
             while (parent!= null && current==parent.right){ //当前节点是父节点的右结点,沿着指向父节点的指针一直向上遍历,
                                                          //知道找到一个是它父节点的左子节点的节点,如果这样的节点存在,
                                                          //那么这个节点的父节点就是我们要找的下一个节点。
                 current = parent;
                 parent = parent.next;
             }
             pNext = parent; //当前结点是它父节点的左子节点,则这个节点的父节点就是我们要找的下一个节点
             
         }
         return pNext; //返回当前结点的下一个节点
         
     }
}


                          

猜你喜欢

转载自blog.csdn.net/g1607058603/article/details/80813014