【剑指offer】11-二叉树的下一个节点

题目:

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


 思路:

见书P65

# -*- coding:utf-8 -*-
# class TreeLinkNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
#         self.next = None
class Solution:
    def GetNext(self, pNode):
        # write code here
        if not pNode:
            return

        # 如果一个节点有右子树
        elif pNode.right is not None:
            pNode = pNode.right
            while pNode.left is not None:
                # 那么它的下一个节点,就是它右子树的最左节点
                pNode = pNode.left
            return pNode

        # 如果一个节点没有右子树,且它还是它父节点的右子节点
        elif pNode.next is not None and pNode.next.right == pNode:
            # 沿着父节点的指针向上遍历,找到一个是它父节点的左子节点的节点
            while pNode.next is not None and pNode.next.left != pNode:
                pNode = pNode.next
            # 若存在,则该节点的父节点就是下一个节点
            return pNode.next

        # 如果一个节点没有右子树,且它还是它父节点的左子节点
        else:
            # 它的下一个节点为它的父节点
            return pNode.next

 用例:

  1. 完全二叉树、不完全二叉树
  2. 特殊二叉树:所有节点都没有右子节点的二叉树、所有节点都没有左子节点的二叉树、只有一个节点的二叉树
  3. 不同位置的节点的下一个节点(?)

因为喜欢的人很优秀,所以自己也要不断努力啊!

猜你喜欢

转载自www.cnblogs.com/RebeccaG/p/11973481.html