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

来源:互联网 发布:软件项目外包网站 编辑:程序博客网 时间:2024/06/06 02:47

题目描述

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

解题思路

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;    }}
阅读全文
0 0