【发布时间】:2016-07-07 11:24:10
【问题描述】:
BST中的这个递归函数如何返回一个有序的链表?
给定:(结构)
typedef struct TreeNode
{
struct TreeNode *left ; //left child
struct TreeNode *right ; //right child
struct TreeNode *next ; //field for linked list in tree
Data Node_info; //info data in node
} TreeNode;
假设我们有一个数字为 3、2、4 的 BST。 (3 是根,2 是左孩子,4 是右孩子)
我有 2 个功能相同,它们从 BST 创建一个链表。我这里没能跟进递归,如果有人能帮我弄清楚,那就太棒了!
第一个函数:
void what1(TreeNode **head, TreeNode *root)
{
if(root == NULL)
return;
what1((head),root->right);
root->next=(*head);
(*head)=root;
what1((head),root->left);
}
我的计算: 走到右子树,直到我们到达 null,返回,做 4->在 NULL 上的下一个点,在 4 上做头点,然后向左,返回到 4,返回再次到 1,现在 3->在 4 上的下一个点,然后在 4 上做头点,依此类推..
但是我仍然不了解其他函数何时“暂停”以及它们何时执行,这意味着我的计算不准确并且我无法正确跟进该函数,这意味着我在某些地方缺乏对递归的理解.
这是我完全不知道如何遵循它的第二个函数,它实际上做同样的事情。如果您可以帮助我使用这些功能中的任何一个,我将不胜感激,因为我正在尝试完全理解 BST 的递归。在我完全理解这一点之前,我会在这里发布很多关于此的问题。
TreeNode * what2(TreeNode *root)
{
TreeNode *left = NULL, *right = NULL, *tmp = root;
if (root != NULL)
{
left = what2(root->left);
right = what2(root->right);
root->next = right;
if (left != NULL)
{
tmp=left;
while (left->next != NULL)
left=left->next;
left->next=root;
}
}
return tmp;
}
【问题讨论】:
-
我理解正确吗?使用 what1 时,您以 "what1(&root,root)" 开头,其中 "root" 指向树的根,对吗?
-
@dercz 左边的参数是我们要建立的列表,右边的参数是 bst
-
哦,是的,不能使用 &root 作为列表的头部,因为它会创建一个循环。我认为您可以将 Data 设置为 int,构造一些树,用正整数标记顶点并在每个“***->next”分配中添加一些 printf,例如用 "#define id_of(T) (T==NULL?0:T->Node_info)" 然后 "left->next=root; printf(" %d -> %d \n", id_of(left), id_of(root));"等等...加上在每个过程的开头添加有关调用的信息,例如“printf("what1(%d,%d)\n",id_of((*head)),id_of(root));" -- 这是我能想到的检查这些函数的最直接的方法。
标签: c recursion tree binary-search-tree