剑指Offer(57):二叉树的下一个结点

一、题目描述

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


二、解题思路

分三种情况:
1)如果当前结点有右子树,那么它的下一个结点就是它的右子树的最左子结点;
2)如果当前结点没有右子树,且为它父结点的左子结点,那么它的下一个结点就是它的父结点;
3)如果当前结点没有右子树,且为它父结点的右子结点,则一直向上遍历,直到找到一个是它父结点的左子结点的结点。

例如:
   [1]
 [2]   [3]
[4] [5] [6] [7]
中序遍历序列为:{4,2,5,1,6,3,7}
第一种情况:当前结点有右子树,如1,那么它的下一个结点就是它的右子树的最左子结点,为6
   [1]
 [2]   [3]
[4] [5] [6] [7]
第二种情况:当前结点没有右子树,且为它父结点的左子结点,如4,那么它的下一个结点就是它的父结点,为2
   [1]
 [2]   [3]
[4] [5] [6] [7]
第三种情况:当前结点没有右子树,且为它父结点的右子结点,如5,则一直向上遍历,直到找到一个是它父结点的左子结点的结点,为1
   [1]
 [2]   [3]
[4] [5] [6] [7]


三、编程实现

public class Solution {
    public TreeLinkNode GetNext(TreeLinkNode pNode) {
        if (pNode == null) {
            return null;
        }
        // 如果结点有右子树,那么它的下一个结点就是它的右子树的最左子结点
        if (pNode.right != null) {
            pNode = pNode.right;
            while (pNode.left != null) {
                pNode = pNode.left;
            }
            return pNode;
        }
        // 结点没有右子树
        while (pNode.next != null) {
            // 如果结点是它父结点的左子结点,那么它的下一个结点就是它的父结点
            if (pNode.next.left == pNode) {
                return pNode.next;
            }
            // 如果结点是它父结点的右子结点,则一直向上遍历,直到找到一个是它父结点的左子结点的结点
            pNode = pNode.next;
        }
        return null;
    }
}

猜你喜欢

转载自blog.csdn.net/Fan0628/article/details/89176894