大家好,这里是国中之林!
❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看←
一.二叉搜索树的搜索
1.递归实现
目的是要找到与我们给的值相等的节点,如果不相等就需要递归寻找.
如果最后为空,就说明没有找到.
其中Elemtype是int类型.比大小用的宏函数.
目标值比要比的值小就向左递归,反之向右递归.
2.循环实现
如果不相等就一直赋值其孩子来循环比较,直到孩子为空都没有找到的话,就说明没有.
二.二叉搜索树的遍历
1.前序遍历
①.递归实现
先打印根,然后打印左再右.
②.栈实现
递归实现虽然简单,但是栈空间是有限的,递归多了,就容易溢出,所以数据多的话,我们可以使用栈
#pragma once
#include <stdio.h>
#include "tree.h"
#define MAXSIZE 128
typedef Bnode Datatype;
typedef struct _stack
{
Datatype* base;
Datatype* top;
}Stack;
bool initStack(Stack& s)
{
s.base = new Datatype[MAXSIZE];
if (!s.base)
{
return false;
}
s.top = s.base;
return true;
}
bool pushStack(Stack& s,Datatype e)
{
if (s.top - s.base == MAXSIZE)
{
return false;
}
*(s.top++) = e;
return true;
}
bool popStack(Stack& s, Datatype& e)
{
if (s.top == s.base)
{
return false;
}
e = *(--s.top);
return true;
}
Datatype* GetTop(Stack& s)
{
if (s.top != s.base)
{
return s.top - 1;
}
else
{
return NULL;
}
}
bool isEmpty(Stack& s)
{
if (s.top == s.base)
{
return true;
}
else
{
return false;
}
}
void DestoryStack(Stack& s)
{
if (s.base)
{
delete s.base;
s.base = NULL;
s.top = NULL;
}
}
先将栈姚用到的接口定义好,这里栈中保存的数据类型为树的节点.
先初始化栈并将我们的根节点入栈.
然后根节点出栈并打印,如果有右孩子先入栈,如果有左孩子后入栈.
因为我们是栈顶元素先出,所以左孩子后入栈就先出站,直到栈为空为止.
这样就能达到我们前遍历的效果.
2.中序遍历
3.后序遍历
4.层序遍历
三.搜索和前序遍历完整代码
Bnode* queryByRec(Btree* root, ElemType e)
{
if (root == NULL || isEqual(root->data, e))
{
return root;
}
else if (isLess(e, root->data))
{
return queryByRec(root->lchild, e);
}
else
{
return queryByRec(root->rchild, e);
}
}
Bnode* queryByLoop(Btree* root, ElemType e)
{
while (root!=NULL&&!isEqual(root->data,e))
{
if (isLess(e, root->data))
{
root = root->lchild;
}
else
{
root = root->rchild;
}
}
return root;
}
void PreOrderRec(Btree* root)
{
if (root == NULL)
{
return;
}
printf("- %d -", root->data);
PreOrderRec(root->lchild);
PreOrderRec(root->rchild);
}
void PreOrderStack(Btree* root)
{
Bnode cur;
if (root == NULL)
{
return;
}
Stack stack;
initStack(stack);
pushStack(stack, *root);
while (isEmpty(stack))
{
popStack(stack, cur);
printf("- %d -", cur.data);
if (cur.rchild)
{
pushStack(stack, *(cur.rchild));
}
if (cur.lchild)
{
pushStack(stack, *(cur.lchild));
}
}
DestoryStack(stack);
}
OK,今天上午就先到这里了,拜拜2024年8月11日11:41:30