剑指offer:二叉树的下一个结点

题目描述

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

# -*- 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 pNode==None:
            return None
        if pNode.right!=None:
            node=pNode.right
            while node.left!=None:
                node=node.left
            return node
        else:
            while pNode.next!=None:
                if pNode.next.left==pNode:
                    return pNode.next
                pNode=pNode.next
        return None
                

中序遍历的顺序是左中右,下一个结点有以下两种情况:

1.pNode有右结点,我们想中序遍历当遍历pNode后,会进入右子树并从右子树的左孩子开始遍历,所以进入右子树后,一直向左找到左孩子。

2.pNode没有右节点,这种情况比较复杂。如果没有右孩子,那么说明pNode为根的子树遍历完了,要找它的父节点。如果pNode.next.left==pNode,也就是它的父节点的左孩子就是它,那么按照中序排序左中右的顺序,下一个结点就是父节点。如果不是,那么说明pNode是它父亲的右节点,那就接着找它的父节点直到出现之前的情况。

猜你喜欢

转载自blog.csdn.net/gt362ll/article/details/82846320