《剑指offer》58题:二叉树中序遍历下一个节点,二叉树每个节点有指向父节点的指针。
为了更好的讲解用python打印了一棵二叉树出来
from binarytree import pprint,convert
my_list = ['a','b','c','d','e','f','g',None,None,'h','i']
# Convert the list into a tree and return its root
my_tree = convert(my_list)
pprint(my_tree)
可以暴力求解,中序遍历二叉树即可得到所求,复杂度为O(n)
下面的复杂度为O(lgn)
将二叉树看成是搜索二叉树,那么中序遍历下一个节点就是刚好大于输入节点的值。
搜索二叉树的特点:
1.节点的值大于所有左子树节点的值,小于所有右子树节点的值。
2.在画出来的树的图片中,如果连接的斜杠是向左,那么当前节点大于跟斜杠连接的另外一个节点,例如与e节点相连接的b节点的值要小。斜杠向右同理可得。
如果该节点有右孩子,那么右子树的最左的节点就是所求的节点,比如输入b节点,h为所求;
根据上面的特点1,右子树的节点是比输入节点大,要得到一个刚好大于的,只能是右子树中最小的,就是右子树的最左节点。这里可能会考虑到输入节点的父节点,因为输入节点的父节点大于包括输入节点及输入节点其右子树所有的节点,有右子树,那么父节点肯定不是刚好大于输入节点的如果该节点没有右孩子,而且该节点是其父节点的左孩子,那么该节点的父节点也为所求,例如d没有右孩子,但是d是其父节点b的左孩子,所以b为所求;
根据上面的论述,可知。如果该节点没有右孩子,而且是作为左孩子,我们一直向上前进,一直到又一次向右,则此节点即为所求。例如节点i根据操作得到a。
根据上面操作得到的节点所在的子树中,上例中是a所在的子树,i是其左子树中最右的节点(最大),所以a刚好大于i,即为所求。