【数据结构与算法】树的搜索和遍历

大家好,这里是国中之林!
❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看←

一.二叉搜索树的搜索

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值