二叉树的后继节点
什么是二叉树的后继节点呢? 就是这颗二叉树中序遍历顺序中,当前节点的下一个节点称为这个当前节点的后继节点。
与之相反的是前驱节点,前驱节点,就是二叉树中序遍历的顺序中,当前节点的上一个节点。
如下图:
那么下面我们来看一道具体的面试题 :
【题目】 现在有一种新的二叉树节点类型如下,在此节点类型的二叉树中找到一个节点的后继节点
class Node(object):
"""含有父节点属性的节点类"""
def __init__(self, elem, lchild=None, rchild=None, parent=None):
self.elem = elem
self.lchild = lchild
self.rchild = rchild
self.parent = parent
注:该结构比普通二叉树节点结构多了一个指向父节点的parent指针。假设有一 棵Node类型的节点组成的二叉树,树中每个节点的parent指针都正确地指向 自己的父节点,头节点的parent指向None
下面我们来看看这题的思路是什么?
由题目可知,我们的节点类型很特殊,再结合中序遍历的特点是(左,中,右)那么找一个节点的后继节点会有如下两种情况:
情况1:当前节点有右子树
那么针对这个情况,结合我们的中序遍历特点,总结出一个规律 : 如果当前节点有右子树,那么其后继节点为其右子树的最左节点
情况2:当前节点没有有右子树
针对这种情况,那么我们就要用到题目给的条件了,每个节点都有个父节点的属性,我们能通过子节点找到父节点
那么其规律是:如果当前节点没有右子树,定义第一个指针指向当前节点,然后找其父节点,用第二个指针指向它,如果指针1所指的节点是指针2的左孩子,那该指针2节点就是其后继节点,如果不是其左孩子,那么指针1指向其父节点,原来的指针2也指向他的父节点(也就是指针1和指针2都往上调一格)直到指针1所指的节点是指针2节点的左孩子,那么指针2所指的节点就是其后继节点。
所以这就是上面的两种情况,