如何解决在C中没有递归地遍历二进制搜索树的有序和预序遍历
问题: 编写C函数以对二进制搜索树执行以下操作:
从二元搜索树中删除给定整数。 有序遍历而无需递归。 预先遍历而无需递归。 (不允许使用全局指针)
我的代码:
#include<stdio.h>
#include<stdlib.h>
typedef struct x
{
int data;
struct x* left;
struct x* right;
}node;
node* createNode(int n)
{
node* newNode=(node*)malloc(sizeof(node));
newNode->data=n;
newNode->left=NULL;
newNode->right=NULL;
return newNode;
}
node* insertion(node* root,int n)
{
if(root==NULL) return createNode(n);
else if(n < root->data) root->left=insertion(root->left,n);
else if(n > root->data) root->right=insertion(root->right,n);
return root;
}
int search(node* root,int key)
{
if (root==NULL)
return 0;
else
{
if (key<root->data)
search(root->left,key);
else if(key>root->data)
search(root->right,key);
else
return 1;
}
}
node* deletion(node* root,int n)
{
if (root==NULL) return root;
if (n<root->data)
root->left=deletion(root->left,n);
else if (n>root->data)
root->right=deletion(root->right,n);
else
{
if(root->left==NULL)
{
node* temp=root->right;
free(root);
return temp;
}
else if(root->right==NULL)
{
node* temp=root->left;
free(root);
return temp;
}
node* temp=root->right;
while (temp&&temp->left!=NULL)
temp=temp->left;
root->data=temp->data;
root->right=deletion(root->right,temp->data);
}
return root;
}
void display(node* root,int n)
{
if (root==NULL)
{
for (int i = 0; i < n-2; i++)
printf(" ");
printf("NULL\n");
}
else
{
display(root->right,n+5);
for (int i = 0; i < n+2; i++)
printf(" ");
printf("/\n");
for (int i = 0; i < n; i++)
printf(" ");
printf("%d\n",root->data,n+5);
for (int i = 0; i < n+2; i++)
printf(" ");
printf("\\\n");
display(root->left,n+5);
}
}
int nodes(node* root)
{
if(root==NULL)
return 0;
else
return 1 + nodes(root->left) + nodes(root->right);
}
void inorder(node* root)
{
}
void preorder(node* root)
{
}
int main()
{
int ch;
node* root=NULL;
while (1)
{
printf("\n1. INSERTION OF INTEGER\n");
printf("2. DELETION OF INTEGER\n");
printf("3. DISPLAY TREE\n");
printf("4. IN-ORDER TRAVERSAL\n");
printf("5. PRE-ORDER TRAVERSAL\n");
printf("6. EXIT\n");
printf("Enter your choice: ");
scanf("%d",&ch);
if(ch==1)
{
int n;
printf("Please enter an element: ");
scanf("%d",&n);
root=insertion(root,n);
printf("%d inserted in BINARY SEARCH TREE.\n",n);
}
else if(ch==2)
{
int n;
printf("Please enter the element to be deleted: ");
scanf("%d",&n);
root=deletion(root,n);
printf("%d deleted from BINARY SEARCH TREE.\n",n);
}
else if(ch==3)
{
printf("\n");
display(root,1);
}
else if(ch==4)
{
printf("\n IN-ORDER\n");
inorder(root);
}
else if(ch==5)
{
printf("\n PRE-ORDER\n");
preorder(root);
}
else if(ch==6)
{
printf("Exitting Program,Thank You.\n");
break;
}
else
printf("INVALID CHOICE! TRY AGAIN\n");
}
return 0;
}
我已经删除了,但是无法弄清楚如何使用迭代循环进行有序和预排序,如果有人可以帮忙,请帮助我。
解决方法
执行深度优先搜索之所以如此自然地进行递归,是因为您可以轻松地返回/回溯到较早的状态并探索不同的分支。编译器通过使用由参数和局部变量组成的状态堆栈来实现此目的。因此,可以通过使用堆栈来实现递归替换。
,非递归顺序遍历可以通过使用Morris Traversal之类的方法修改并随后恢复链接来执行。假设这是一项家庭作业,我假设您应该在查找现有算法(例如Morris Traversal)之前尝试自己实施此任务。因此,此时,修改链接的提示可能足以使您实现解决方案。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。