这是我的代码,在这里我需要搜索一个整数类型为x
的二叉树,并且需要返回一个匹配节点的BTREE类型的指针窗口。
这里的程序遇到case2,但仍然没有搜索节点。我找不到我的错误。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct tree
{
int data;
struct tree *left;
struct tree *right;
}tree;
int AddToArray(tree *node, int arr[], int i);
tree *CreateNode(int data);
tree *Insert(tree *node, int data);
void PrintPreorder(tree *node);
int count(tree *node);
int compare(const void * a, const void * b);
//-------------------------------------------------------------------------------------------------
int main()
{
int i;
int choice;
int num;
int count;
int size;
int *arr=NULL;
tree *root=NULL;
while (1)
{
printf("enter your choice \n 1.Insert into tree \n");
printf("enter your choice \n 2.search element \n");
scanf("%d",&choice);
switch (choice)
{
case 1:
printf("Enter the input : \n");
scanf("%d",&num);
root = Insert(root, 4);
root = Insert(root, 3);
root = Insert(root, 5);
root = Insert(root, 10);
root = Insert (root, 8);
root = Insert (root, 7);
root = Insert(root,num);
break;
case 2:
printf("\n enter the element to be searched");
scanf("%d",&num);
for(i=0;i<100;i++)
{
if(arr[i]==num) {
printf("\n element found");
break;
}
}
if(i==count)
printf("\n element not found");
break;
}
printf("\n***BINARY TREE (PREORDER)***\n");
PrintPreorder(root);
}
}
/*intf("\n\n***ARRAY***\n");
arr = calloc(size, sizeof(int));
AddToArray(root, arr, 0);
qsort(arr,size,sizeof(int),compare);
for (i=0; i<size; i++)
{
printf("arr[%d]: %d\n", i, arr[i]);
}*/
//-------------------------------------------------------------------------------------------------
int compare(const void * a, const void * b)
{
return ( *(int*)a - *(int*)b );
}
int AddToArray(tree *node, int arr[], int i)
{
if(node == NULL)
return i;
arr[i] = node->data;
i++;
if(node->left != NULL)
AddToArray(node->left, arr, i);
if(node->right != NULL)
AddToArray(node->right, arr, i);
arr[i] = node->data;
i++;
}
tree *CreateNode(int data)
{
tree *node = (tree *)malloc(sizeof(tree));
node -> data = data;
node -> left = node -> right = NULL;
return node;
}
tree *Insert(tree *node, int data)
{
if(node==NULL)
{
tree *temp;
temp = CreateNode(data);
return temp;
}
if(data >(node->data))
{
node->right = Insert(node->right,data);
}
else if(data < (node->data))
{
node->left = Insert(node->left,data);
}
/* Else there is nothing to do as the data is already in the tree. */
return node;
}
void PrintPreorder(tree *node)
{
if(node==NULL)
{
return;
}
printf("%d ",node->data);
PrintPreorder(node->left);
PrintPreorder(node->right);
}
答案 0 :(得分:1)
首先为arr
分配内存
您要求binary tree
,但您的代码显示您正在使用BST
。[添加功能]。
如果它是没有排序的二叉树,那么你必须使用标准树遍历或BFS或DFS等搜索所有节点。
If it is `BST` then it will be easier.
1. Check the value x=root.val return root
2. else if( root.val> x) return search(x,root.left);
3. else return search(x,root.right);
关于SO中MCV
示例的一件事情。 :)
注1:要分配数组,您可以拥有arr=malloc(sizeof(int)*n);
注2:如果您正在使用数组,那么您将以这种方式存储它们
[ root root.left root.right root.left.left root.left.right root.right.left ... ]
1
/ \
2 3
/ \ / \
4 5 6 7
注3:为什么你在这种情况下使用数组..root可以访问任何其他节点..如果你不想动态分配那么只存储它们一个数组,否则你只需要在需要时动态插入必要的节点。
bool search(node * root, int x)
{
if(root->val==x)
return true;
else
{
if(x<root->val) //value is smaller go to the left subtree
return search(root->left,x);
else
return search(root->right,x);
}
}
struct node* insert(struct node* node, int val)
{
if (node == NULL)
{
struct node *temp = malloc(sizeof(struct node));
temp->val = val;
temp->left = temp->right = NULL;
return temp;
}
if (val < node->val)
node->left = insert(node->left, val);
else if (val > node->val)
node->right = insert(node->right,val);
/* return the (unchanged) node pointer */
return node;
}
然后你也可以使用一些数组[就像我们在堆中那样]或使用类似结构的图形(邻接列表..)。 这完全取决于你的实施。
点击此链接获取提示 - Binary tree implementation。
您只需将遍历代码更改为此..
int levelOrder_Search(struct node* root)
{
struct Queue* queue = createQueue(SIZE);
Enqueue(root, queue);
while (!isEmpty(queue))
{
struct node* temp = Dequeue(queue);
if(temp->data==x)
return 1; // found :-)
if (temp->left)
Enqueue(temp->left, queue);
if (temp->right)
Enqueue(temp->right, queue);
}
return 0;//not found
}