ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2020-05-31 21:08:05  阅读:218  来源: 互联网

标签:结点 遍历 offer 中序 pNode 二叉树 null 节点


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

题目描述:

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

解题思路:

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

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

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

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

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

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

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

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

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

实现代码如下:

 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     }

 

标签:结点,遍历,offer,中序,pNode,二叉树,null,节点
来源: https://www.cnblogs.com/shengguilv/p/13021047.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有