【问题标题】:Inorder Successor of Binary tree二叉树的中序后继
【发布时间】:2019-12-12 01:14:09
【问题描述】:

我正在学习如何在二叉搜索树中找到中序继任者 我了解到:

  1. 如果节点的右子树不为NULL,则后继节点位于右子树中。跟随。

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

  2. 如果节点的右子树为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; 
}

【问题讨论】:

    标签: c


    【解决方案1】:

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

    首先考虑获取 '3' 的后继,因为右孩子为空,所以你必须上树到第一个祖先的父母,即其父母的左孩子。请记住,在二叉搜索树中,每个左子节点都小于当前节点,每个右子节点都大于当前节点。按照这个逻辑,任何左孩子的父母都会比那个孩子大。

    现在考虑获取“4”的后继节点,首先您将转到“6”,但由于它有一个左子节点,该左下降树中的任何节点都将介于 4 和 6 之间,即最左边的子节点直接右孩子将是此类节点的直接继承者。

    【讨论】:

      猜你喜欢
      • 2012-09-09
      • 1970-01-01
      • 2011-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-26
      • 1970-01-01
      相关资源
      最近更新 更多