当前位置:  首页>> 技术小册>> 数据结构与算法(下)

题目描述

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

解法

对于结点 pNode

  • 如果它有右子树,则右子树的最左结点就是它的下一个结点;
  • 如果它没有右子树,判断它与父结点 pNode.next 的位置情况:
    • 如果它是父结点的左孩子,那么父结点 pNode.next 就是它的下一个结点;
    • 如果它是父结点的右孩子,一直向上寻找,直到找到某个结点,它是它父结点的左孩子,那么该父结点就是 pNode 的下一个结点。
  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. /**
  13. * @author bingo
  14. * @since 2018/10/28
  15. */
  16. public class Solution {
  17. /**
  18. * 获取中序遍历结点的下一个结点
  19. * @param pNode 某个结点
  20. * @return pNode的下一个结点
  21. */
  22. public TreeLinkNode GetNext(TreeLinkNode pNode) {
  23. if (pNode == null) {
  24. return null;
  25. }
  26. if (pNode.right != null) {
  27. TreeLinkNode t = pNode.right;
  28. while (t.left != null) {
  29. t = t.left;
  30. }
  31. return t;
  32. }
  33. // 须保证 pNode.next 不为空,否则会出现 NPE
  34. if (pNode.next != null && pNode.next.left == pNode) {
  35. return pNode.next;
  36. }
  37. while (pNode.next != null) {
  38. if (pNode.next.left == pNode) {
  39. return pNode.next;
  40. }
  41. pNode = pNode.next;
  42. }
  43. return null;
  44. }
  45. }

测试用例

  1. 普通二叉树(完全二叉树;不完全二叉树);
  2. 特殊二叉树(所有结点都没有左/右子结点;只有一个结点的二叉树;二叉树的根结点为空);
  3. 不同位置的结点的下一个结点(下一个结点为当前结点的右子结点、右子树的最左子结点、父结点、跨层的父结点等;当前结点没有下一个结点)。

该分类下的相关小册推荐: