【问题标题】:In-order successor of a Binary Tree二叉树的有序后继
【发布时间】:2012-09-09 21:31:50
【问题描述】:

我正在编写一个代码来查找二叉树( NOT A BINARY SEARCH TREE )的有序后继。这只是一个练习题。更喜欢复习树的概念。

我正在进行有序遍历并跟踪前一个节点。每当前一个节点变得等于我们正在搜索的后继节点时,我打印当前节点。

void inOrder(node* root , node* successorFor) {
  static node* prev = null;
  if(!root)
     return;
  inOrder(root->left,successorFor);
  if(prev == successorFor )
     print(root);
  prev = root;
  inOrder(root->right,successorFor);
}

我正在寻找一些我的解决方案可能会失败的测试用例?我的方法是否正确?如果不是,那我该怎么办?

【问题讨论】:

  • prev 定义在哪里?
  • 我相信算法是对的,但是打印successorFor有意义吗?或者你实际上是要打印root?
  • @DavidB 完成。它是一个静态变量。
  • @Marcus 是的,只是一个错字,它只是 root。我会编辑。
  • 这是 C++ 还是 C 还是 Java?这不是全部三个。

标签: data-structures language-agnostic tree binary-tree


【解决方案1】:

这个算法的基本逻辑是tree walk。 你拨打print(TREE-SUCCESSOR(root, k).key)之类的电话

TREE-SUCCESSOR(root, k)
    if root == NIL
        return NIL
    left = TREE-SUCCESSOR(root.left, k)
    right = TREE-SUCCESSOR(root.right, k)
    successor = NIL
    if root.key > k
        successor = root
    if left
        if k < left.key
            if successor
                if left.key < successor.key
                    successor = left
            else
                successor = left
    if right
        if k < right.key
            if successor
                if right.key < successor.key
                    successor = right
            else
                successor = right
    return successor

【讨论】:

  • 它只是一棵二叉树,我需要找到一个节点的下一个中序后继节点,即在给定节点之后的树遍历过程中我会得到的下一个节点。
  • 这个算法不假设任何关于后继者的位置,这就是为什么递归调用左孩子和右孩子。
猜你喜欢
  • 2019-12-12
  • 2011-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多