题目描述

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

代码一

思想
非常好理解,找到根节点,然后对二叉树中序遍历,添加到arrlist里面去.

  1. public class Solution {
  2. ArrayList<TreeLinkNode> list = new ArrayList<TreeLinkNode>();
  3. public TreeLinkNode GetNext(TreeLinkNode pNode)
  4. {
  5. TreeLinkNode root = pNode;
  6. //找根节点
  7. while(root.next!=null) {
  8. root = root.next;
  9. }
  10. //然后对该二叉树中序遍历
  11. MidedleOrder(root);
  12. for(int i=0;i<list.size();i++) {
  13. if(pNode==list.get(i)) {
  14. return i==list.size()-1?null:list.get(i+1);
  15. }
  16. }
  17. return null;
  18. }
  19. public void MidedleOrder(TreeLinkNode root) {
  20. if(root!=null) {
  21. MidedleOrder(root.left);
  22. list.add(root);
  23. MidedleOrder(root.right);
  24. }
  25. }
  26. }

代码二

思想
56 二叉树的下一个结点 - 图1
仔细观察,可以把中序下一结点归为几种类型:

  1. 有右子树,下一结点是右子树中的最左结点,例如 B,下一结点是 H
  2. 无右子树,且结点是该结点父结点的左子树,则下一结点是该结点的父结点,例如 H,下一结点是 E
  3. 无右子树,且结点是该结点父结点的右子树,则我们一直沿着父结点追朔,直到找到某个结点是其父结点的左子树,如果存在这样的结点,那么这个结点的父结点就是我们要找的下一结点。例如 I,下一结点是 A;例如 G,并没有符合情况的结点,所以 G 没有下一结点

    1. public TreeLinkNode GetNext(TreeLinkNode pNode)
    2. {
    3. if(pNode==null)return null;
    4. TreeLinkNode pNext = null;
    5. //如果一个节点有右子树的时候,那么它的下一个节点就是它的右子树中的最左子节点。
    6. if(pNode.right!=null) {
    7. TreeLinkNode pRight = pNode.right;
    8. while(pRight.left!=null) {
    9. pRight = pRight.left;
    10. }
    11. pNext = pRight;
    12. }
    13. //如果一个节点没有右子树的时候
    14. else if(pNode.next!=null) {
    15. TreeLinkNode pCurrent = pNode;
    16. TreeLinkNode pParent = pNode.next;
    17. //如果它是父节点的右节点的话,那么我们就一只向上找父节点,直到找到的父节点不是它父节点的右节点
    18. //如果它不是父节点的右节点的话,那么直接返回父节点
    19. while(pParent!=null&&pCurrent==pParent.right) {
    20. pCurrent = pParent;
    21. pParent = pParent.next;
    22. }
    23. pNext = pParent;
    24. }
    25. return pNext;
    26. }