剑指offer——二叉树的下一个结点

牛客网原题目链接:二叉树的下一个结点

题目描述:

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

解题思路:

对于一个给定的二叉树,题目要求中序遍历,中序遍历的顺序是先中序遍历左子树,再根节点,最后中序遍历右子树。

所以可以使用中序遍历得到整个二叉树的遍历序列,然后再找该节点的下一个值;但是题目要求找的是一个结点,而不是值;所以此法不行。

那么根据中序遍历的特点来分析:

 由于遍历顺序是先左子树,再根,最后右子树;要找的结点就相当于是根结点,那么他的下一个节点就应在其右子树

那么就应该讨论该结点是否有右结点

如果有,那就应该采用此方法遍历其右子树;结果就是其右节点的最左边的结点,或者就是其右节点。

如果没有,那就要判断该结点是其父结点的左结点还是右结点

  如果是其父的左结点,那下一个就是其父节点;

  否则,就是其父结点的父结点,直到是某个父结点的左结点,下一个就是那个父结点。

实现代码如下:

 1     public TreeLinkNode GetNext(TreeLinkNode pNode)
 2     {
 3         if(pNode == null){
 4             return null;
 5         }
 6         //判断是否有右结点
 7         if(pNode.right != null){
 8             pNode = pNode.right;
 9             //寻找该结点最左边的结点
10             while (pNode.left != null){
11                 pNode = pNode.left;
12             }
13             return pNode;
14         }
15         //若没有右结点,就找该结点的父结点
16         while(pNode.next != null){
17             TreeLinkNode root = pNode.next; //定义一个结点作为当前节点的父结点
18             if(root.left == pNode){     //若当前结点是其父结点的左结点,下一个结点就是此父节点
19                 return root;
20             }
21             pNode = pNode.next;     //否则就继续找其父节点
22         }
23         return null;    //若最终找不到,则没有下一个结点
24     }

 

posted @ 2020-05-31 20:55  暮光乐鱼  阅读(128)  评论(0编辑  收藏  举报