每天一道剑指offer-二叉树的下一个结点
https://www.nowcoder.com/practice/ef068f602dde4d28aab2b210e859150a?tpId=13&tqId=11215&tPage=4&rp=3&ru=%2Fta%2Fcoding-interviews&qru=%2Fta%2Fcoding-interviews%2Fquestion-ranking

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

思路

分析二叉树的下一个节点,一共有以下情况:
1.二叉树为空,则返回空;
2.节点右孩子存在,则设置一个指针从该节点的右孩子出发,一直沿着指向左子结点的指针找到的叶子节点即为下一个节点;
3.节点不是根节点。如果该节点是其父节点的左孩子,则返回父节点;否则继续向上遍历其父节点的父节点,重复之前的判断,返回结果。代码如下:

代码

  1. /*
  2. public class TreeLinkNode {
  3. int val;
  4. TreeLinkNode left = null;
  5. TreeLinkNode right = null;
  6. TreeLinkNode next = null;
  7. TreeLinkNode(int val) {
  8. this.val = val;
  9. }
  10. }
  11. */
  12. public class Solution {
  13. public TreeLinkNode GetNext(TreeLinkNode pNode)
  14. {
  15. if(pNode == null)
  16. return null;
  17. if(pNode.right != null)
  18. {//如果右子树不为空,那么中序遍历的下一个节点就是右子树的中的最左的那个节点
  19. TreeLinkNode temp = pNode.right;
  20. while(temp.left != null)
  21. temp = temp.left;
  22. return temp;
  23. }
  24. TreeLinkNode temp = pNode.next;//父节点
  25. TreeLinkNode pre = pNode;//当前节点
  26. while(temp != null)
  27. {
  28. if(temp.left == pre)
  29. return temp;//如果当前节点pre是父节点的左子树,那么父节点就是下一个节点,终止循环
  30. pre = temp;//如果不是,那么就pre指向父节点
  31. temp = temp.next;//父节点指向自己的父节点,也就是向上一层移动
  32. }
  33. return temp;
  34. }
  35. }

posted on 2019-02-21 23:03 程序员乔戈里 阅读() 评论() 编辑 收藏

版权声明:本文为qiaogeli原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/qiaogeli/p/10415905.html