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

Posted on 2018-10-18 10:03  _hqc  阅读(192)  评论(0编辑  收藏  举报

题目描述

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

题目地址

https://www.nowcoder.com/practice/9023a0c988684a53960365b889ceaf5e?tpId=13&tqId=11210&rp=3&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

思路

三种情况

1)当前结点有右子树。当前结点的下一结点是右子树中的最左子结点,如node=8,它的下一结点为12.

clip_image001

2)当前结点无右子树,且当前结点是其父结点的左孩子。下一结点为当前结点的父结点,如node=8,它的下一个结点为12。

clip_image002

3)当前结点无右子树,且当前结点是其父结点的右孩子。则一直向上遍历,直到找到最靠近的一个祖先节点pNode且pNode是其父节点的左子节点,那么输入节点的下一个结点就是pNode的父节点。如node=14,它的下一个结点为16.

clip_image003

Python

# -*- coding:utf-8 -*-
class TreeLinkNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None
        self.next = None
node1 = TreeLinkNode(1)
node2 = TreeLinkNode(2)
node3 = TreeLinkNode(3)
node4 = TreeLinkNode(4)
node5 = TreeLinkNode(5)
node1.left = node2
node1.right = node3
node3.left = node4
node4.right = node5
node2.next = node1
node3.next = node1
node4.next = node3
node5.next = node4
class Solution:
    def GetNext(self, pNode):
        # write code here
        pNext = None
        # 如果以下都不满足返回空
        if not pNode:
            pNext = pNode
        if pNode.right:
            # 如果当前结点有右子树,则下一结点在右子树的最下左结点
            pNode = pNode.right
            while pNode.left:
                pNode = pNode.left
            pNext = pNode
        else:
            if pNode.next and pNode == pNode.next.left:
                # 如果当前结点有父结点并且当前结点是父结点的左子结点,下一结点为父结点
                pNext = pNode.next
            elif pNode.next and pNode == pNode.next.right:
                # 如果当前结点有父结点并且当前结点是父结点的右子结点,向上遍历
                pNode = pNode.next
                while pNode.next and pNode == pNode.next.right:
                    pNode = pNode.next
                # 当遍历到当前结点为父结点的左子结点时,输入结点的下一个结点为当前结点的父结点
                if pNode.next:
                    pNext = pNode.next
        return pNext

if __name__ == '__main__':
    result = Solution().GetNext(node1)