剑指offer第八题:二叉树的下一个节点

题目描述:

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

 

思路:

根据中序遍历的特点,要找到一个节点的下一个节点无非就是三种情况:1、有右子树,这时只需要把其右孩子作为下一个遍历的(并不是要找的)节点,然后沿着该节点的左子树(如果有的话)出发,直到遇到叶子节点,那么该叶子节点就是其下一个要找的节点;2、没有右子树,则判断该节点是否是其父节点的左孩子,如果是则其下一个要找的节点是其父节点;3、如果不是其父节点的左孩子,则把其父节点作为下一个遍历的节点,向上回溯,直到找到父节点没有父节点并且父节点是父节点的父节点的左孩子为止。综合这三种情况就可以找到二叉树中任意一个节点的下一个节点。

# _*_encoding:utf-8 _*_

class TreeNode:

#建立二叉树节点的属性

    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None
        # parent 在第一题中不需要用到
        # 为了方便第二题,在重建的时候把父节点也找出来
        self.parent = None

class Solution:
    def get_next_node(self, node):
        """
        获取下一个节点
        """
        if not node:
            return None
        if node.right:
            # 如果存在有右节点,那么下一个节点就是右子树的最左节点
            node = node.right
            while node.left:
                node = node.left
            return node
        elif node.parent:
            # 如果存在父节点
            # 下一个节点一直向上遍历,直到找到一个节点是另外一个节点的左节点,
            # 或者遍历到达根节点了,那么不存在下一个节点
            while node.parent and node.parent.right == node:
                # 循环向上遍历,只到找到不是某个节点的右节点或者到达根节点
                # 情况1:一个节点是父节点的左节点,那么下一个节点是这个父节点
                # 情况2: 达到根节点,根节点的父节点为None
                node = node.parent
            return node.parent
        # 否则不存在下一个节点
        return None

关键在标黄的一句上,当前节点父节点存在且当前节点为父节点的右节点,node=node.parent不断循环。直到该节点为左节点or到达根节点。

 

https://blog.youkuaiyun.com/l_vip/article/details/78735556

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值