数据结构源码(四)二叉树ADT

本文详细介绍了二叉树的四种类型:二叉查找树,包括其特点;表达式树,涵盖前缀、中缀和后缀表达式及其转换方法;AVL树,一种保持高度平衡的树结构;以及伸展树,一种根据访问频率动态调整节点位置的树。
摘要由CSDN通过智能技术生成

一、二叉查找树

二叉查找树的特点是每个节点最多只能有两个儿子节点,并且父节点大于左子节点,小于右子节点。

#include <iostream>
#include <algorithm>
using namespace std;

typedef int ElementType;//数据类型

//二叉树的每个节点不能有多于两个的儿子
struct TreeNode;
typedef struct TreeNode *Position;
typedef struct TreeNode *SearchTree;

SearchTree MakeEmpty(SearchTree T);
Position Find(ElementType X, SearchTree T);
Position FindMin(SearchTree T);
Position FindMax(SearchTree T);
SearchTree Insert(ElementType X, SearchTree T);
SearchTree Delete(ElementType X, SearchTree T);
ElementType Retrieve(Position P);
void PrintTree(SearchTree T);
int Height(Position P);

struct TreeNode
{
   
	ElementType Element;
	SearchTree Left;
	SearchTree Right;
};


SearchTree MakeEmpty(SearchTree T)
{
   
	if (T != NULL)
	{
   
		MakeEmpty(T->Left);//递归清空子节点
		MakeEmpty(T->Right);
		free(T);//最后再清空二叉查找树
	}
	return NULL;
}
//节点大于左子节点 小于右子节点
Position Find(ElementType X, SearchTree T)
{
   
	if (T == NULL)
		return NULL;
	if (X < T->Element)
		return Find(X, T->Left);
	else if (X > T->Element)
		return Find(X, T->Right);
	else
		return T;
}

Position FindMin(SearchTree T)
{
   
	if (T == NULL)
		return NULL;
	else if (T->Left == NULL)//已经找不到最小值了
		return T;
	else
		return FindMin(T->Left);
}


Position FindMax(SearchTree T)
{
   
	//递归方式
	if (T == NULL)
		return NULL;
	else if (T->Right == NULL)//已经找不到最大值了
		return T;
	else
		return FindMax(T->Right);
	/*
	//非递归方式
	if(T!=NULL)
		while(T->Right != NULL)
			T=T->Right;
	return T;
	*/
}

SearchTree Insert(ElementType X, SearchTree T)
{
   
	if (T == NULL)
	{
   
		//创建并返回一个单节点树
		T = (SearchTree)malloc(sizeof(struct TreeNode));
		if (T == NULL)
		{
   
			cerr << "Out of space" << endl;
		}
		else
		{
   
			T->Element = X;
			T->Left = T->Right = NULL;
		}
	}
	else
	{
   
		if (X < T-
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
/* * 二叉树节点ADT接口 */ package dsa; public interface BinTreePosition extends Position { //判断是否有父亲(为使代码描述简洁) public boolean hasParent(); //返回当前节点的父节点 public BinTreePosition getParent(); //设置当前节点的父节点 public void setParent(BinTreePosition p); //判断是否为叶子 public boolean isLeaf(); //判断是否为左孩子(为使代码描述简洁) public boolean isLChild(); //判断是否有左孩子(为使代码描述简洁) public boolean hasLChild(); //返回当前节点的左孩子 public BinTreePosition getLChild(); //设置当前节点的左孩子(注意:this.lChild和c.parent都不一定为空) public void setLChild(BinTreePosition c); //判断是否为右孩子(为使代码描述简洁) public boolean isRChild(); //判断是否有右孩子(为使代码描述简洁) public boolean hasRChild(); //返回当前节点的右孩子 public BinTreePosition getRChild(); //设置当前节点的右孩子(注意:this.rChild和c.parent都不一定为空) public void setRChild(BinTreePosition c); //返回当前节点后代元素的数目 public int getSize(); //在孩子发生变化后,更新当前节点及其祖先的规模 public void updateSize(); //返回当前节点的高度 public int getHeight(); //在孩子发生变化后,更新当前节点及其祖先的高度 public void updateHeight(); //返回当前节点的深度 public int getDepth(); //在父亲发生变化后,更新当前节点及其后代的深度 public void updateDepth(); //按照中序遍历的次序,找到当前节点的直接前驱 public BinTreePosition getPrev(); //按照中序遍历的次序,找到当前节点的直接后继 public BinTreePosition getSucc(); //断绝当前节点与其父亲的父子关系 //返回当前节点 public BinTreePosition secede(); //将节点c作为当前节点的左孩子 public BinTreePosition attachL(BinTreePosition c); //将节点c作为当前节点的右孩子 public BinTreePosition attachR(BinTreePosition c); //前序遍历 public Iterator elementsPreorder(); //中序遍历 public Iterator elementsInorder(); //后序遍历 public Iterator elementsPostorder(); //层次遍历 public Iterator elementsLevelorder(); }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值