剑指offer之二叉树的下一个结点(中序遍历)

中序遍历

1、中序遍历根节点的左子树;

2、访问根节点;

3、中序遍历根节点的右子树;

中序遍历结果:dbheiafcg

问题描述

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

思路及代码

三种情况:

1、该结点有右子树,则下一结点为右子树中序遍历的最左节点;

2、该结点无左子树&&父节点不为空{

caseA:该节点为父节点的左节点,则下一节点为父节点;

caseB:该结点为父节点的右节点,则向上遍历至当前结点为父节点的左节点(非右节点),则当前结点的父节点为下一节点;

或一直向上遍历到当前结点无父节点,则当前结点无下一节点。

}

/*
public class TreeLinkNode {
    int val;
    TreeLinkNode left = null;
    TreeLinkNode right = null;
    TreeLinkNode next = null;

    TreeLinkNode(int val) {
        this.val = val;
    }
}
*/
public class Solution {
    public TreeLinkNode GetNext(TreeLinkNode pNode) {
        if (pNode == null)
            return pNode;
        //case 1 该结点有右子树
        TreeLinkNode pNext = null;
         if(pNode.right != null){
             TreeLinkNode p1= pNode.right;
             while(p1.left!= null){
                 p1= p1.left;
             }
              pNext= p1;
         }else{
        //case 2 该结点无右子树
        //该结点为父节点的左结点,则该父节点就是下一个结点
        //该结点为父节点的右节点,则向上遍历至当前结点为父节点的左结点或无父节点
           if( pNode.next != null){
            TreeLinkNode current = pNode;
            TreeLinkNode parent = pNode.next;
            while(current.next!=null && parent.right == current){
                current = parent;
                parent = parent.next;
            }
            pNext= parent;
        }
         }
        return pNext;
    }
}
经验分享 程序员 微信小程序 职场和发展