如果该节点存在前驱结点,前驱结点不可能存在右子树,因为右子树比前驱结点大,而前驱结点的定义是比该节点小的最大节点,也就是中序遍历结果中在该节点前面一个的结点。
1)先看该节点是否存在左子树,如果存在直接找“左子树 ”中最大的就是他的前驱结点,这里你可能有点不太理解,为什么说他存在左子树,前驱结点一定在他的左子树呢?首先,我们验证他的正确性 。结点左子树比该节点小,我在左子树中找到最大的结点,这满足前驱的定义;那前驱节点为什么不能是他的兄弟或者兄弟子树呢,你这样想,不妨设该节点是它父节点的右子树(左子树也一样),他比父节点和兄弟结点都大,满足前驱结点比该节点小的要求,但是,该节点的左子树能在这个位置的原因是:他比该节点(所求结点)的父节点大,比该节点小;这说明了该节点的左子树一定比他的父节点和他的兄弟结点大,所以说他的左子树更符合前驱结点的特点。
2)如果该节点不存在左子树,说明这时候他是没有子树的状态,所以我们要往上找,往他的父节点找。这时候我们需要找到他的父节点,如果父节点的右子树是该节点,皆大欢喜啊,因为这种情况下,他的父节点就是他的前驱结点啊;如果他是他父节点的左子树,那父节点比该节点大,我们继续往上找,操作是把该节点父节点设为当前节点,父节点是之前父节点的父节点,找啊找啊,直到出现转折,之前是“丿”这样的,直到 出现">",大于号的上面就是当前的父节点,他比“丿”任何一个元素都小,所以这就是正解啦!~~~~
附上代码:
BiTree* predeceNode(BiTree* root,int value)
{
BiTree* current=findNode(root,value);
if(current->left)
return maximum(current->
left);
BiTree* parent=current->parent;
BiTree* child=current;
while(parent&&parent->left==child)
{
child=parent;
parent=parent->parent;
}
return parent;
}`