繁体   English   中英

二叉树的有序继承者

[英]Inorder Successor of Binary tree

我正在学习如何在二进制搜索树中找到有序后继者,我知道:

  1. 如果节点的右子树不为NULL,则后继者位于右子树中。 请遵循。

    转到右侧子树,并在右侧子树中返回键值最小的节点。

  2. 如果节点的右子树为NULL,则后继者是祖先之一。 请遵循。

    使用父指针向上移动,直到看到其父节点的左子节点。 这样的节点的父节点是后继节点。

我不明白为什么为什么如果正确的子树不为null,我们必须返回最小值的节点,如果正确的子树为null,我们必须找到其父级的左子节点。 这样的节点的父节点是后继节点。

请帮助。这是该算法的关键。

struct node * inOrderSuccessor(struct node *root, struct node *n) 
{ 
  // step 1 of the above algorithm  
  if( n->right != NULL ) 
    return minValue(n->right); 

  // step 2 of the above algorithm 
  struct node *p = n->parent; 
  while(p != NULL && n == p->right) 
  { 
     n = p; 
     p = p->parent; 
  } 
  return p; 
}

考虑以下树:4 2 6 1 3 5

首先考虑获取“ 3”的后继者,因为右孩子为空,所以您必须将树上移到第一个祖先的父亲,即其祖先的左孩子。 请记住,在二叉搜索树中,每个左子节点将小于当​​前节点,而每个右子节点将大于当前节点。 按照这种逻辑,任何左孩子的父母都将大于该孩子。

现在考虑获取“ 4”的后继者,首先您要转到“ 6”,但是由于它有一个左子节点,因此该左后裔树中的任何节点都将在4到6之间,即紧邻的右子节点的最左子节点将直接成为该节点的后继者。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM