后继算法

时间:2009-12-13 19:18:13

标签: algorithm

我需要一个算法来返回某个任意节点的后继节点 给定二叉搜索树。

4 个答案:

答案 0 :(得分:5)

为您提供与您的问题具有相同详细程度的答案:继续往右走,然后离开,直到您到达一片叶子。

答案 1 :(得分:1)

有两种通用方法:

  • 如果二进制树节点具有指向其父节点的指针,则可以直接从节点遍历到后继节点。您必须确定如何使用父指针进行遍历。
  • 如果您的二叉树节点有父指针,那么您将不得不从根开始对树进行顺序遍历(可能是您有根节点指针)并返回下一个给定节点之后的节点。

答案 2 :(得分:0)

在下降树时需要保持zipper。拉链只是您遍历的节点的列表,并且每个都指示您下次是向左还是向右。 即使没有从孩子到父母的任何指示,它也允许你在树上旅行。

继承人的算法是,只要你从左边来,然后再向右走,然后下降到最左边的孩子,就可以返回(在拉链中)。

数字更容易......

答案 3 :(得分:0)

节点的后继者意味着您正在寻找一个顺序继承者。 以下方法可帮助您确定顺序继承者没有任何父母节点或额外空间不可再生

struct node * inOrderSuccessor(struct node *root, struct node *n)
   { 
   //*If the node has a right child, return the smallest value of the right sub tree*

   if( n->right != NULL ) 
      return minValue(n->right); 

   //*Return the first ancestor in whose left subtree, node n lies*
   struct node *succ=NULL;
   while(root) 
   { 
      if(n->datadata < root->data) 
         {
            succ=root; root=root->left; 
         }

      else if(n->data > root->data) 
         root=root->right; 
      else break; 
   } 
  return succ;
 }

我很确定这是对的。如果我错了,请纠正我。谢谢。