剑指offer_二叉树---二叉树的下一节点

简介: 剑指offer_二叉树---二叉树的下一节点

##题目描述

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

##解题思路

1,因为是中序遍历,顺序为左—中----右

2,因为考虑下一个节点,所以考察范围可以缩小到中和右

3,如果当前节点有右子树,那么下一个节点就是右子树的最左节点

4,如果当前节点没有右子树,且是父节点的左子节点,则下一个节点就是自己的父节点

5,如果当前节点没有右子树,且是父节点的右子节点,则向上找到第一个是其父节点左子节点的节点,下一个节点就是该父节点

##代码

/**
 * 
 */
package offerTest;
/**
 * <p>
 * Title:Next
 * </p>
 * <p>
 * Description:
 * </p>
 * 
 * @author 田茂林
 * @data 2017年8月21日 上午10:34:53
 */
class TreeLinkNode {
  int val;
  TreeLinkNode left = null;
  TreeLinkNode right = null;
  TreeLinkNode next = null;
  TreeLinkNode(int val) {
    this.val = val;
  }
}
public class Next {
  public TreeLinkNode GetNext(TreeLinkNode pNode) {
    if (pNode == null) {
      return null;
    }
    // 如果当前节点有右子树
    if (pNode.right != null) {
      TreeLinkNode p = pNode.right;
      while (p.left != null) {
        p = p.left;
      }
      return p;
    } else { // 如果当前节点没有右子树,且是父节点的左子节点
      if (pNode.next != null) {
        TreeLinkNode pcur = pNode;
        TreeLinkNode parent = pcur.next;
        if (parent != null && pcur == parent.left) { 如果当前节点没有右子树,且是父节点的左子节点,则下一个节点就是自己的父节点
          return parent;
        }
        while (parent != null && pcur == parent.right) {如果当前节点没有右子树,且是父节点的右子节点,则向上找到第一个是其父节点左子节点的节点,下一个节点就是该父节点
          pcur = parent;
          parent = pcur.next;
        }
        return parent;
      }
    }
    return null;
  }
}


相关文章
代码随想录 Day13 二叉树 LeetCode T104 二叉树的最大深度 T111 二叉树的最小深度 T222完全二叉树的节点个数
代码随想录 Day13 二叉树 LeetCode T104 二叉树的最大深度 T111 二叉树的最小深度 T222完全二叉树的节点个数
57 0
|
6月前
|
Java BI 数据库管理
二叉树---前,中,后序遍历做题技巧(前,中,后,层次,线索二叉树)
二叉树---前,中,后序遍历做题技巧(前,中,后,层次,线索二叉树)
85 11
|
6月前
|
机器学习/深度学习
【二叉树 OJ题】二叉树基础知识 与 OJ题完成(二叉树构建与遍历问题,子树查找问题)
树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。
43 1
|
算法 C语言 C++
【树】你真的会二叉树了嘛? --二叉树LeetCode专题
先来一题简单的题目练练手,之前有提到过,二叉树的前序遍历就是通过根左右的遍历方式来进行的,所以这题总体思路也是一样.不过要说明的是,这里采用了c语言,所以输出时需要自己创建一个动态数组,每次将访问到的val存入动态数组当中即可.
56 0
剑指offer-7.二叉树的下一个节点
剑指offer-7.二叉树的下一个节点
36 1
|
存储 算法 C语言
【树】你真的会二叉树了嘛? --二叉树LeetCode专题Ⅱ
这里有两种方法(深度优先搜索与广度优先搜索)其实也就是前序遍历与层序遍历,层序遍历这里简单提一下.与上面的大同小异就不过多赘述了:依旧是遍历出每一层最大的值,将其放入数组即可.
67 0
|
算法 C语言 C++
【树】你真的会二叉树了嘛? --二叉树LeetCode专题Ⅳ
本章依然是二叉树的刷题 忘记的朋友们可以去看看我的二叉树专题
57 0
剑指offer_二叉树---二叉搜索树的第k个结点
剑指offer_二叉树---二叉搜索树的第k个结点
64 0
|
算法
剑指offer_二叉树---平衡二叉树
剑指offer_二叉树---平衡二叉树
69 0
剑指offer_二叉树---二叉搜索树的后序遍历
剑指offer_二叉树---二叉搜索树的后序遍历
68 0