- 思想:
(1)根节点为该值,说明找到了,返回该结点。
(2)未找到,在左子树中递归查找,找到返回结点
(3)左子树查找结果为空,则在右子树中递归查找。
- 代码:
1.返回K值所在节点
//在二叉树中查找某值的结点
Node* Find(Node* root, char k)
{
Node* p = NULL;
if (root == NULL)
return NULL;
if (root->value == k)
return root;
p = Find(root->left, k);
if (p != NULL)
return p;
/*这两行代码很重要,必须要有,递归的结果只返回到了p内,
还没返回到main函数内,因此需要再ruturn一次*/
return Find(root->right, k);
}
2.返回k值的双亲结点:
//在二叉树中查找某值的结点
Node* FindParent(Node* root, char k)
{
Node* p = NULL;
if (root == NULL)
return NULL;
//如果有左/右孩子,并且孩子的值等于k,返回根节点
if (root->left!=NULL&&root->left->value == k||
root->right != NULL && root->right->value == k)
return root;
//不然,左孩子进行递归查找
p = FindParent(root->left, k);
//在左孩子中找到,返回该节点,未找到右孩子继续查找
if (p != NULL)
return p;
return FindParent(root->right, k);
}
- 完整代码:
typedef struct node
{
char value;//当前节点值
struct node* left;//指向当前节点左孩子指针
struct node* right;//指向当前节点右孩子指针
}Node;
typedef struct tree
{
Node* root;
}Tree;
void InitTree(Tree* t)
{
t->root = NULL;
}
//先序遍历创建二叉树
Node* Create(const char*& str) //因为要修改字符串就加了引用&
{
if (*str == '*')
return NULL;
else
{
Node* newnode = (Node*)malloc(sizeof(Node));
if (newnode != NULL)
{
newnode->value = *str;
newnode->left = Create(++str);
newnode->right = Create(++str);
return newnode;
}
}
}
//在二叉树中查找K值的结点,返回K所在结点
Node* Find(Node* root, char k)
{
Node* p = NULL;
if (root == NULL)
return NULL;
if (root->value == k)
return root;
p = Find(root->left, k);
if (p != NULL)
return p;
return Find(root->right, k);
}
//在二叉树中查找K值,返回K值的双亲的结点
Node* FindParent(Node* root, char k)
{
Node* p = NULL;
if (root == NULL)
return NULL;
//如果有左/右孩子,并且孩子的值等于k,返回根节点
if (root->left!=NULL&&root->left->value == k||
root->right != NULL && root->right->value == k)
return root;
//不然,左孩子进行递归查找
p = FindParent(root->left, k);
//在左孩子中找到,返回该节点,未找到右孩子继续查找
if (p != NULL)
return p;
return FindParent(root->right, k);
}
int main()
{
Tree t;
InitTree(&t);
const char* str = "ABDG**HI****CE*J**F**";
t.root = Create(str);
Node* p = Find(t.root, 'B');
//Node* p = Find(t.root, 'Z');
//Node* p = FindParent(t.root, 'B');
if (p != NULL)
printf("找到了!,p=%d", p->value);
else
printf("未找到!");
}
注:创建的二叉树如下图所示,创建思路:创建二叉树
- 运行结果:
1.返回K值所在节点:
2.返回k值双亲结点
3.未找到的情况