带索引的二叉搜索树

带索引的二叉搜索树
带索引的二叉搜索树

带索引的二叉搜索树

//file:indexedBSTree.h

#pragma once

#include "BSTree.h"

template

class IndexedBSTree : public BSTree

{

public:

void Create();

bool Search(const K& k,E& e)const;

bool IndexSearch(int k,E& e)const;

IndexedBSTree& Insert(const E& e);

IndexedBSTree& Delete(const K& k,E& e);

IndexedBSTree& IndexDelete(int k,E& e);

void Ascend();

void IndexOutput();

private:

static void OutputLeftSize(BinaryTreeNode *t);

};

template

void IndexedBSTree::Create()

{//产生一个空的带索引的二叉搜索树

root = 0;

}

template

bool IndexedBSTree::Search(const K& k,E& e) const

{//将关键值为k的元素返回到e中;如果操作失败返回false,否则返回true return BSTree::Search(k,e);

}

template

bool IndexedBSTree::IndexSearch(int k,E& e) const

{//将第k个元素返回到e中

if(!root)

return false;

BinaryTreeNode *p = root;

while(p)

{

if(k < p->LeftSize)

p = p->LeftChild;

else if(k > p->LeftSize)

{

k -= p->LeftSize;

p = p->RightChild;

}

else

{

e = p->data;

return true;

}

}

return false;

}

template

IndexedBSTree& IndexedBSTree::Insert(const E& e)

{

BSTree::Insert(e);

BinaryTreeNode *t = root;

while(t)

{

if(e < t->data)

{

t->LeftSize++;

t = t->LeftChild;

}

else if(e > t->data)

t = t->RightChild;

else

{

t->LeftSize = 1;

return *this;

}

}

}

template

IndexedBSTree& IndexedBSTree::Delete(const K& k,E& e) {//删除关键值为k的元素并且将其返回到e中

//将p指向关键值为k的节点

BinaryTreeNode *p = root,//搜索指针

*pp = 0;//p的父节点指针

while(p && p->data != k)

{//移动到p的孩子

pp = p;

if(k < p->data)

{

p = p->LeftChild;

}

else

p = p->RightChild;

}

if(!p)

throw BadInput();//没有关键值为k的元素

e = p->data;//保存欲删除的元素

BinaryTreeNode *t = root;//搜索指针

while(t && t->data != k)

{//移动到p的孩子

if(k < t->data)

{

t->LeftSize--;

t = t->LeftChild;

}

else

t = t->RightChild;

}

//对树进行重构

//处理p有两个孩子的情形

if(p->LeftChild && p->RightChild)

{//两个孩子

//转换成有0或1个孩子的情形

//在p的左子树中寻找最大元素

BinaryTreeNode *s = p->LeftChild,*ps = p;//s的父节点while(s->RightChild)

{//移动到较大的元素

ps = s;

s = s->RightChild;

}

p->LeftSize = p->LeftSize - 1;//修改所删除元素的索引值

//将最大元素从s移动到p

p->data = s->data;

p = s;

pp = ps;

}

//p最多有一个孩子

//在c中保存孩子指针

BinaryTreeNode *c;

if(p->LeftChild)

c = p->LeftChild;

else

c= p->RightChild;

//删除p

if(p == root)

root = c;

else

{//p是pp的左孩子还是pp的右孩子?

if(p == pp->LeftChild)

{

pp->LeftChild = c;

}

else

pp->RightChild = c;

}

delete p;

return *this;

}

template

IndexedBSTree& IndexedBSTree::IndexDelete(int k,E& e) {//删除第k个元素并将其返回到e中

BinaryTreeNode *p = root,

*pp = 0;//指向第k个元素的父节点

//寻找删除点

while(p && k != p->LeftSize)

{

pp = p;

if(k < p->LeftSize)

{

p = p->LeftChild;

}

else if(k > p->LeftSize)

{

k -= p->LeftSize;

p = p->RightChild;

}

}

if(!p)

throw BadInput();//没有关键值为k的元素

e = p->data;//保存欲删除的元素

//调整LeftSize值

BinaryTreeNode *t = root;//搜索指针

while(p && k != t->LeftSize)

{//移动到t的孩子

if(k < t->LeftSize)

{

t = t->LeftChild;

}

else if(k > p->LeftSize)

{

k -= t->LeftSize;

t = t->RightChild;

}

}

//对树进行重构

//处理p有两个孩子的情形

if(p->LeftChild && p->RightChild)

{//两个孩子

//转换成有0或1个孩子的情形

//在p的左子树中寻找最大元素

BinaryTreeNode *s = p->LeftChild,*ps = p;//s的父节点while(s->RightChild)

{//移动到较大的元素

ps = s;

s = s->RightChild;

}

p->LeftSize = p->LeftSize - 1;//修改所删除元素的索引值

//将最大元素从s移动到p

p->data = s->data;

p = s;

pp = ps;

}

//p最多有一个孩子

//在c中保存孩子指针

BinaryTreeNode *c;

if(p->LeftChild)

c = p->LeftChild;

else

c= p->RightChild;

//删除p

if(p == root)

root = c;

else

{//p是pp的左孩子还是pp的右孩子?

if(p == pp->LeftChild)

{

pp->LeftChild = c;

}

else

pp->RightChild = c;

}

delete p;

return *this;

}

template

void IndexedBSTree::Ascend()

{//按照关键值的升序排列输出所有元素

InOutput();

}

template

void IndexedBSTree::IndexOutput()

{//中序遍历,输出节点元素的索引值

InOrder(OutputLeftSize,root);

cout<

}

template

void IndexedBSTree::OutputLeftSize(BinaryTreeNode *t) {//输出节点元素的索引值

cout<LeftSize<<' ';

}

//file:BSTree.h

#pragma once

#include "binaryTree.h"

template

class BSTree : public BinaryTree

{

public:

bool Search(const K& k,E& e)const;

BSTree& Insert(const E& e);

BSTree& Delete(const K& k,E& e);

void Ascend() {InOutput();}

void traversalBSTree(int a[]);

void traversalBSTree0(BinaryTreeNode *t,int &pos,int a[]);

BSTree& DeleteMax(E& x);

};

template

bool BSTree::Search(const K& k,E& e) const

{//搜索与k匹配的元素

//指针p从树根开始进行查找

if(!root)

return false;

BinaryTreeNode *p = root;

while(p)//检查p->data

{

if(k < p->data)

p = p->LeftChild;

else if(k > p->data)

p = p->RightChild;

else

{

e = p->data;

return true;

}

}

return false;

}

template

BSTree& BSTree::Insert(const E& e)

{//如果不出现重复,则插入e

BinaryTreeNode *p = root,//搜索指针

*pp = 0;

//寻找插入点

while(p)

{//检查p->data

pp = p;

//将p移向孩子节点

if(e < p->data)

p = p->LeftChild;

else if(e > p->data)

p = p->RightChild;

else

throw BadInput();//出现重复

}

//为e建立一个节点,并将该节点连接至pp

BinaryTreeNode *r = new BinaryTreeNode (e);

if(root)

{//树非空

if(e < pp->data)

pp->LeftChild = r;

else

pp->RightChild = r;

}

else//插入到空树

root = r;

return *this;

}

template

BSTree& BSTree::Delete(const K& k,E& e) {//删除关键值为k的元素,并将其放入e

//将p指向关键值为k的节点

BinaryTreeNode *p = root,//搜索指针

*pp = 0;//p的父节点指针

while(p && p->data != k)

{//移动到p的孩子

pp = p;

if(k < p->data)

else

p = p->RightChild;

}

if(!p)

throw BadInput();//没有关键值为k的元素

e = p->data;//保存欲删除的元素

//对树进行重构

//处理p有两个孩子的情形

if(p->LeftChild && p->RightChild)

{//两个孩子

//转换成有0或1个孩子的情形

//在p的左子树中寻找最大元素

BinaryTreeNode *s = p->LeftChild,*ps = p;//s的父节点while(s->RightChild)

{//移动到较大的元素

ps = s;

s = s->RightChild;

}

//将最大元素从s移动到p

p->data = s->data;

p = s;

pp = ps;

}

//p最多有一个孩子

//在c中保存孩子指针

BinaryTreeNode *c;

if(p->LeftChild)

c = p->LeftChild;

else

c= p->RightChild;

//删除p

if(p == root)

root = c;

else

{//p是pp的左孩子还是pp的右孩子?

if(p == pp->LeftChild)

pp->LeftChild = c;

else

}

delete p;

return *this;

}

template

void BSTree::traversalBSTree(int a[])

{

int pos = 0;

traversalBSTree0(root,pos,a);

}

template

void BSTree::traversalBSTree0(BinaryTreeNode *t,int &pos,int a[]) {

if (!t)

return;

traversalBSTree0(t->LeftChild, pos, a);

a[pos++] = t->data;

traversalBSTree0(t->RightChild, pos, a);

}

template

BSTree& BSTree::DeleteMax(E& x)

{

if (!root)

throw OutOfBounds();

BinaryTreeNode *p = root,

*pp = 0;

while (p->RightChild)

{

pp = p;

p = p->RightChild;

}

x = p->data;

if (p == root)

root = p->LeftChild;

else

pp->RightChild = p->LeftChild;

delete p;

return *this;

}

//file:binaryTree.h

#ifndef _BINARYTREE_H_

#define _BINARYTREE_H_

#include "BinaryTreeNode.h"

#include "linkedQueue.h"

#include "exception.h"

int _count = 0;

template

class BinaryTree

{

template

friend class IndexedBSTree;

template

friend class BSTree;

public:

BinaryTree() {root = 0;}

~BinaryTree() {}

bool IsEmpty() const {return ((root) ? false : true);}

bool Root(T& x) const;

void SetRoot(BinaryTreeNode* t) {root = t;}

BinaryTreeNode* GetRoot() {return root;}

void MakeTree(const T& element,BinaryTree& left,BinaryTree& right);

void BreakTree(T& element,BinaryTree& left,BinaryTree& right);

void PreOrder(void (*Visit)(BinaryTreeNode *u))

{PreOrder(Visit,root);}

void InOrder(void (*Visit)(BinaryTreeNode *u))

{InOrder(Visit,root);}

void PostOrder(void (*Visit)(BinaryTreeNode *u))

{PostOrder(Visit,root);}

void LevelOrder(void (*Visit)(BinaryTreeNode *u));

void PreOutput()

{PreOrder(Output,root);cout<

void InOutput()

{InOrder(Output,root);cout<

void PostOutput()

{PostOrder(Output,root);cout<

void LevelOutput()

{LevelOrder(Output);cout<

void Delete()

{PostOrder(Free,root);root = 0;}

int Height() const

{return Height(root);}

int Size();

BinaryTreeNode* search(T element) {return search(element, root);}

BinaryTreeNode* copy(BinaryTreeNode * t);

int NumLeaves()

{return CountLeaf(root);}

void Swap()

{Swap0(root);}

bool Compare(BinaryTree& X)

{return Compare1(root,X.root);}

bool IsHBLT()

{return IsHBLT(root);}

private:

BinaryTreeNode *root;//根节点指针

void PreOrder(void (*Visit)(BinaryTreeNode *u),BinaryTreeNode *t);

void InOrder(void (*Visit)(BinaryTreeNode *u),BinaryTreeNode *t);

void PostOrder(void (*Visit)(BinaryTreeNode *u),BinaryTreeNode *t);

static void Output(BinaryTreeNode *t);

static void Free(BinaryTreeNode *t) {delete t;}

int Height(BinaryTreeNode *t) const;

static void Add1(BinaryTreeNode *t) {_count++;}

//int Count(BinaryTreeNode *t) const;

BinaryTreeNode* search(T& element,BinaryTreeNode *t);

int CountLeaf(BinaryTreeNode *t);

void Swap0(BinaryTreeNode *t);

bool Compare1(BinaryTreeNode *p,BinaryTreeNode *t);

bool IsHBLT(BinaryTreeNode * t);

};

template

bool BinaryTree::Root(T& x) const

{//取根节点的data域,放入x

//如果没有根节点,则返回false

if(root)

{

x = root->data;

return true;

}

else

return false; //没有根节点

}

template

void BinaryTree::MakeTree(const T& element,BinaryTree& left,BinaryTree& right) {//将left,right和element合并成一棵新树

//left,right和this必须是不同的树

//创建新树

root = new BinaryTreeNode (element,left.root,right.root);

//阻止访问left和right

left.root = right.root = 0;

}

template

void BinaryTree::BreakTree(T& element,BinaryTree& left,BinaryTree& right) {//left,right和this必须是不同的树

//检查树是否为空

if(!root) throw BadInput(); //空树

//分解树

element = root->data;

left.root = root->LeftChild;

right.root = root->RightChild;

delete root;

root = 0;

}

template

void BinaryTree::LevelOrder(void (*Visit)(BinaryTreeNode *u))

{//逐层遍历

LinkedQueue*> Q;

BinaryTreeNode *t;

t = root;

while(t)

{

Visit(t);

if(t->LeftChild)

Q.Add(t->LeftChild);

if(t->RightChild)

Q.Add(t->RightChild);

try{Q.Delete(t);}

catch (OutOfBounds){return ;}

}

}

template

int BinaryTree::Size()

{

_count = 0;

PreOrder(Add1,root);

return _count;

}

/*int size(){

return Count(root);

}*/

template

BinaryTreeNode* BinaryTree::copy(BinaryTreeNode * t) {

if (!t)

return 0;// empty tree

BinaryTreeNode * left = copy(t->LeftChild);

BinaryTreeNode * right = copy(t->RightChild);

root = new BinaryTreeNode ;

root->data = t->data;

root->LeftChild = left;

root->RightChild = right;

return root;

}

/*

template

bool BinaryTree::Compare(BinaryTree& X)

{//比较该二叉树与二叉树X

BinaryTreeNode *t = X.GetRoot();

return Compare1(root,t);

}

*/

//**********************************私有函数成员*******************************************

template

void BinaryTree::PreOrder(void (*Visit)(BinaryTreeNode *u),BinaryTreeNode *t) {//前序遍历

if(t)

{

Visit(t);

PreOrder(Visit,t->LeftChild);

PreOrder(Visit,t->RightChild);

}

}

template

void BinaryTree::InOrder(void (*Visit)(BinaryTreeNode *u),BinaryTreeNode *t) {//中序遍历

if(t)

{

InOrder(Visit,t->LeftChild);

Visit(t);

InOrder(Visit,t->RightChild);

}

}

template

void BinaryTree::PostOrder(void (*Visit)(BinaryTreeNode *u),BinaryTreeNode *t) {//后序遍历

if(t)

{

PostOrder(Visit,t->LeftChild);

PostOrder(Visit,t->RightChild);

Visit(t);

}

}

template

void BinaryTree::Output(BinaryTreeNode *t)

{

cout<data<<' ';

}

template

int BinaryTree::Height(BinaryTreeNode *t) const

{//返回树*t的高度

if(!t)

return 0; //空树

int hl = Height(t->LeftChild);//左子树的高度

int hr = Height(t->RightChild);//右子树的高度

if(hl > hr)

return ++hl;

else

return ++hr;

}

/*

template

int BinaryTree::Count(BinaryTreeNode *t) const

{

if (!t) return 0;

int left,right;

left = Count(t->LeftChild);

right = Count(t->RightChild);

return 1 + left + right;

}

*/

template

BinaryTreeNode* BinaryTree::search(T& element,BinaryTreeNode *t) {

if (!t)

return 0;

if(t->data == element)

return t;

BinaryTreeNode * p;

p = search(element, t->LeftChild);

if(p)

return p;

return search(element, t->RightChild);

}

template

int BinaryTree::CountLeaf(BinaryTreeNode *t)

{

if(!t)

return 0;

if(!t->LeftChild && !t->RightChild)

return 1;

int c1,c2;

c1 = CountLeaf(t->LeftChild);

c2 = CountLeaf(t->RightChild);

return c1 + c2;

}

template

void BinaryTree::Swap0(BinaryTreeNode *t)

{//交换二叉树所有节点的左右子节点

if(t)

{

if(t->LeftChild || t->RightChild)

{

BinaryTreeNode *temp = t->LeftChild;

t->LeftChild = t->RightChild;

t->RightChild = temp;

}

Swap0(t->LeftChild);

Swap0(t->RightChild);

}

}

template

bool BinaryTree::Compare1(BinaryTreeNode *p,BinaryTreeNode *t) {

if(!p && !t)

return true;

if((!p && t) || (p && !t))

return false;

if(p && t)

{

if(p->data == t->data)

{

bool left = Compare1(p->LeftChild,t->LeftChild);

bool right = Compare1(p->RightChild,t->RightChild);

if(left && right)

return true;

else

return false;

}

else

return false;

}

}

template

bool BinaryTree::IsHBLT(BinaryTreeNode * t)

{

if(!t)

return true;

if(!t->LeftChild && t->RightChild)

return false;

if(t->LeftChild && !t->RightChild)

return true;

bool bLeft = IsHBLT(t->LeftChild);

bool bRight = IsHBLT(t->RightChild);

if(bLeft && bRight)

return true;

else

return false;

}

//***************************************************************************** **************

#endif

//file:binaryTreeNode.h

#ifndef _BINARYTREENODE_H_

#define _BINARYTREENODE_H_

#include

using namespace std;

template

class BinaryTree;

template

class BinaryTreeNode

{

template

friend class IndexedBSTree;

template

friend class BSTree;

friend class BinaryTree;

friend ostream& operator<<(ostream& out,BinaryTreeNode *p);

BinaryTreeNode()

{

LeftChild = RightChild = 0;

}

BinaryTreeNode(const T& e)

{

data = e;

LeftChild = RightChild = 0;

}

BinaryTreeNode(const T& e,BinaryTreeNode *l,BinaryTreeNode *r)

{

data = e;

LeftChild = l;

RightChild = r;

}

T GetData(){return data;}

void SetLeftChild(BinaryTreeNode *left) {LeftChild = left;}

void SetRightChild(BinaryTreeNode *right) {RightChild = right;} private:

T data;

BinaryTreeNode *LeftChild,//左子树

*RightChild;//右子树

int LeftSize;//索引值= 该节点左子树的元素个数加1

};

template

ostream& operator<<(ostream& out,BinaryTreeNode *p)

{

out<GetData()<

return out;

}

#endif

//file:linkedQueue.h

#ifndef _LINKEDQUEUE_H_

#define _LINKEDQUEUE_H_

#include "node.h"

#include "exception.h"

template

class LinkedQueue

public:

LinkedQueue() {front = rear = 0;}//构造函数

~LinkedQueue();//析构函数

bool IsEmpty() const

{return ((front) ? false : true);}

bool IsFull() const;

T First() const;//返回第一个元素

T Last() const;//返回最后一个元素

Node* GetFront(){return front;}

LinkedQueue& Add(const T& x);

LinkedQueue& Delete(T& x);

private:

Node *front;//指向第一个节点

Node *rear;//指向最后一个节点

};

template

LinkedQueue::~LinkedQueue()

{//队列析构函数,删除所有节点

Node *next;

while(front)

{

next = front->link;

delete front;

front = next;

}

}

template

bool LinkedQueue::IsFull() const

{//判断队列是否已满

Node *p;

try

{

p = new Node;

delete p;

return false;

}

catch(NoMem)

{return true;}

}

template

T LinkedQueue::First() const

二叉排序树的基本操作的实现

二叉排序树的基本操作的实现

————————————————————————————————作者: ————————————————————————————————日期:

二叉排序树的基本操作的实现

一设计要求 1.问题描述 从磁盘读入一组数据,建立二叉排序树并对其进行查找、、遍历、插入、删除等基本操作。 2.需求分析 建立二叉排序树并对其进行查找,包括成功和不成功两种情况。 二概要设计 为了实现需求分析中的功能,可以从以下3方面着手设计。 1.主界面设计 为了方便对二叉排序树的基本操作,设计一个包含多个菜单选项的主控制子程序以实现二叉排序树的各项功能。本系统的主控制菜单运行界面如图1所示。 图1二叉排序树的基本操作的主菜单 2.存储结构的设计 本程序主要采二叉树结构类型来表示二叉排序树。其中二叉树节点由1个表示关键字的分量组成,还有指向该左孩子和右孩子的指针。 3.系统功能设计 本程序设置了5个子功能菜单,其设计如下。 1)建立二叉排序树。根据系统提示,输入节点的关键字,并以0作为结束的标识符。 该功能由Bstree Create()函数实现。 2)插入二叉排序新的节点信息。每次只能够插入一个节点信息,如果该节点已 经存在,则不插入。该功能由Bstree Insert(y)函数实现。 3)查询二叉排序树的信息。每次进行查询,成功则显示“查询到该节点”,不成功 则“显示查询不到该节点“该功能由Bstree Search()函数实现。 4)删除二叉排序树的节点信息。可以对二叉排序树中不需要的节点进行删除, 删除的方式是输入关键字,查询到该节点后删除。该功能由BstreeDelete() 函数实现。 5)遍历二叉排序树。遍历二叉排序树可以显示该二叉排序树的全部节点信息。 该功能由void Traverse()实现。 三模块设计 1.模块设计 本程序包含两个模块:主程序模块和二叉排序树操作模块。其调用关系如图2

二叉排序树的建立及遍历的实现

课程设计任务书 题目: 二叉排序树的建立及遍历的实现 初始条件: 理论:学习了《数据结构》课程,掌握了基本的数据结构和常用的算法; 实践:计算机技术系实验室提供计算机及软件开发环境。 要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1、系统应具备的功能: (1)建立二叉排序树; (2)中序遍历二叉排序树并输出排序结果; 2、数据结构设计; 3、主要算法设计; 4、编程及上机实现; 5、撰写课程设计报告,包括: (1)设计题目; (2)摘要和关键字; (3)正文,包括引言、需求分析、数据结构设计、算法设计、程序实现及测试、设计体会等; (4)结束语; (5)参考文献。 时间安排:2007年7月2日-7日(第18周) 7月2日查阅资料 7月3日系统设计,数据结构设计,算法设计 7月4日-5日编程并上机调试7月6日撰写报告 7月7日验收程序,提交设计报告书。 指导教师签名: 2007年7月2日 系主任(或责任教师)签名: 2007年7月2日 排序二叉树的建立及其遍历的实现

摘要:我所设计的课题为排序二叉树的建立及其遍历的实现,它的主要功能是将输入的数据 组合成排序二叉树,并进行,先序,中序和后序遍历。设计该课题采用了C语言程序设计,简洁而方便,它主要运用了建立函数,调用函数,建立递归函数等等方面来进行设计。 关键字:排序二叉树,先序遍历,中序遍历,后序遍历 0.引言 我所设计的题目为排序二叉树的建立及其遍历的实现。排序二叉树或是一棵空树;或是具有以下性质的二叉树:(1)若它的左子树不空,则作子树上所有的结点的值均小于它的根结点的值;(2)若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;(3)它的左,右子树也分别为二叉排序树。对排序二叉树的建立需知道其定义及其通过插入结点来建立排序二叉树,遍历及其输出结果。 该设计根据输入的数据进行建立排序二叉树。对排序二叉树的遍历,其关键是运用递归 调用,这将极大的方便算法设计。 1.需求分析 建立排序二叉树,主要是需要建立节点用来存储输入的数据,需要建立函数用来创造排序二叉树,在函数内,需要进行数据比较决定数据放在左子树还是右子树。在遍历二叉树中,需要建立递归函数进行遍历。 该题目包含两方面的内容,一为排序二叉树的建立;二为排序二叉树的遍历,包括先序遍历,中序遍历和后序遍历。排序二叉树的建立主要运用了循环语句和递归语句进行,对遍历算法运用了递归语句来进行。 2.数据结构设计 本题目主要会用到建立结点,构造指针变量,插入结点函数和建立排序二叉树函数,求深度函数,以及先序遍历函数,中序遍历函数和后序遍历函数,还有一些常用的输入输出语句。对建立的函明确其作用,先理清函数内部的程序以及算法在将其应用到整个程序中,在建立排序二叉树时,主要用到建立节点函数,建立树函数,深度函数,在遍历树是,用到先序遍历函数,中序遍历函数和后序遍历函数。

第6章 树和二叉树 作业

第6章树和二叉树作业 1、假设在树中,结点x是结点y的双亲时,用(x,y)来表示树边。已知一棵树的树边集合为{ (e,i), (b,e), (b,d), (a,b), (g,j), (c,g), (c,f), (h,l), (c,h), (a,c) } ,用树型表示法表示该树,并回答下列问题: ①哪个是根结点? 哪些是叶子结点? 哪个是g的双亲? 哪些是g的祖先? 哪些是g的孩子? 那些是e的子孙? 哪些是e的兄弟? 哪些是f 的兄弟? ②b和n的层次各是多少? 树的深度是多少? 以结点c为根的子树的深度是多少? 2、一棵深度为h的满k叉树有如下性质:第h层上的结点都是叶子结点,其余各层上每个结点都有k棵非空子树。如果按层次顺序(同层自左至右)从1开始对全部结点编号,问: ①各层的结点数是多少? ②编号为i的结点的双亲结点(若存在)的编号是多少? ③编号为i的结点的第j个孩子结点(若存在)的编号是多少? ④编号为i的结点的有右兄弟的条件是什么? 其右兄弟的编号是多少? 3、设有如图6-27所示的二叉树。 ①分别用顺序存储方法和链接存储方法画 出该二叉树的存储结构。 ②写出该二叉树的先序、中序、后序遍历序 列。 4、已知一棵二叉树的先序遍历序列和中序遍 历序列分别为ABDGHCEFI和 GDHBAECIF,请画出这棵二叉树,然后给 出该树的后序遍历序列。

5、设一棵二叉树的中序遍历序列和后序遍历序列分别为BDCEAFHG 和DECBHGFA ,请画出这棵二叉树,然后给出该树的先序序列。 6、已知一棵二叉树的中序遍历序列和后序遍历序列分别为dgbaekchif 和gdbkeihfca,请画出这棵二叉树对应的中序线索树和后序线索树。 7、以二叉链表为存储结构,请分别写出求二叉树的结点总数及叶子结点总数的算法。 8、设图6-27所示的二叉树是森林F所对应的二叉树,请画出森林F。 9、设有一棵树,如图6-28 所示。 ①请分别用双亲表示法、孩 子表示法、孩子兄弟表示法 给出该树的存储结构。 ②请给出该树的先序遍历 序列和后序遍历序列。 ③请将这棵树转换成二叉 树。 10、设给定权值集合 w={3,5,7,8,11,12} ,请构造 关于w的一棵huffman树,并求其加权路径长度WPL 。 11、假设用于通信的电文是由字符集{a, b, c, d, e, f, g, h}中的字符构成,这8个字符在电文中出现的概率分别为{0.07, 0.19, 0.02, 0.06, 0.32, 0.03, 0.21, 0.10} 。 ①请画出对应的huffman树(按左子树根结点的权小于等于右子树根结点的权的次序构造)。 ②求出每个字符的huffman编码。

树和二叉树作业(一)

树作业(一) 【作业要求】 1.提交文档,写出答案 2.如果有需要绘图,可以手绘拍照节省时间 【题目说明】 1 单项选择题 1. 由于二叉树中每个结点的度最大为2,所以二叉树是一种特殊的树,这种说法_B_。 A. 正确 B. 错误 2. 假定在一棵二叉树中,双分支结点数为15,单分支结点数为30个,则叶子结点数为 B 个。 A.15 B.16C.17D.47 3. 按照二叉树的定义,具有3个结点的不同形状的二叉树有__C__种。 A. 3 B. 4 C. 5 D. 6 4. 按照二叉树的定义,具有3个不同数据结点的不同的二叉树有__C__种。 A. 5 B. 6 C. 30 D. 32 5. 深度为5的二叉树至多有__C__个结点。 A. 16 B. 32 C. 31 D. 10 6. 设高度为h的二叉树上只有度为0和度为2的结点,则此类二叉树中所包含的结点数至少为_ _B__。 A. 2h B. 2h-1 C. 2h+1 D. h+1 7. 对一个满二叉树,m个树叶,n个结点,深度为h,则__D__ 。 A. n=h+m B. h+m=2n C. m=h-1 D. n=2 h-1 8. 如图1所示的4棵二叉树,__C__不是完全二叉树。

(A) (B) (C) (D) 图1 9. 树最适合用来表示__C__。 A. 有序数据元素 B. 无序数据元素 C. 元素之间具有分支层次关系的数据 D. 元素之间无联系的数据 2 填空题 1. 举例说明树和二叉树的两个主要差别_树的节点的最大度数没有限制,但是二叉树的节点的最大度数为2___、__树中节点的子节点没有顺序之分,但是二叉树中节点的子节点分左孩子、右孩子__。 2. 一棵二叉树的结点数据采用顺序存储结构,存储于数组t中,如下图所示,请画出该二叉树的形态。 123456789101112131415161718192021 e a f d g c j l h b 一棵二叉树的顺序存储数组t 3. 深度为k的完全二叉树至少有__2k?1__个结点。至多有__2k?1__个结点,若按自上而下,从左到右次序给结点编号(从1开始),则编号最小的叶子结点的编号是__2k?2+1__。 4、已知一棵完全二叉树的第6层(设根是第1层)有8个叶结点,则该完全二叉树的结点个数最多是多少?

实验10 二叉树的基本操作

浙江大学城市学院实验报告 课程名称数据结构 实验项目名称实验十二叉树的基本操作 学生姓名专业班级学号 实验成绩指导老师(签名)日期 一.实验目的和要求 1、掌握二叉树的链式存储结构。 2、掌握在二叉链表上的二叉树操作的实现原理与方法。 3、进一步掌握递归算法的设计方法。 二.实验内容 1、按照下面二叉树二叉链表的存储表示,编写头文件binary_tree.h,实现二叉链表的定义与基本操作实现函数;编写主函数文件test10.cpp,验证头文件中各个操作。 二叉树二叉链表存储表示如下: typedef struct BiTNode { TElemType data ; struct BiTNode *lchild , *rchild ; }BiTNode,*BiTree ; 基本操作如下: ①void InitBiTree(BiTree &T ) //初始化二叉树T ②void CreateBiTree(BiTree &T) //按先序遍历序列建立二叉链表T ③bool BiTreeEmpty (BiTree T); //检查二叉树T是否为空,空返回1,否则返回0 ④int BiTreeDepth(BiTree T); //求二叉树T的深度并返回该值 ⑤void PreOrderTraverse (BiTree T); //先序遍历二叉树T ⑥void InOrderTraverse (BiTree T); //中序遍历二叉树T ⑦void PostOrderTraverse (BiTree T); //后序遍历二叉树T ⑧void DestroyBiTree(BiTree &T) //销毁二叉树T

作业-树和二叉树

树 (树根结点的高度为1) 一、选择题 3.以下说法错误的是( )。 A.完全二叉树上结点之间的父子关系可由它们编号之间的关系来表达B.在三叉链表上,二叉树的求双亲操作很容易实现 C.在二叉链表上,求根以及求左、右孩子等操作很容易实现 D.在二叉链表上,求双亲操作的时间性能很好 4.以下说法错误的是( )。 A.一般在哈夫曼树中,权值越大的叶子离根结点越近 B.哈夫曼树中没有度数为1的分支结点 C.若初始森林中共有n棵二叉树,最终求得的哈夫曼树共有2n-1个结点D.若初始森林中共有n棵二叉树, 进行2n-1次合并后才能剩下一棵最终的哈夫曼树 5.深度为6的二叉树最多有( )个结点。 A.64 B.63 C.32 D.31 6.将含有41个结点的完全二叉树从根结点开始编号,根为1号, 后面按从上到下、从左到右的顺序对结点编号, 那么编号为21的双亲结点编号为( )。 A.10B.11 C.41 D.20 7.设深度为k的二叉树上只有度为0和度为2的结点, 则这类二叉树上所含结点总数最少( )个。 A.k+l B.2k C.2k-1D.2k+1 8.下列说法中正确的是( )。 A.任何一棵二叉树中至少有一个结点的度为2 B.任何一棵二叉树中每个结点的度都为2 C.任何一棵二叉树中的每个结点的度肯定等于2 D.任何一棵二叉树中的每个结点的度都可以小于2 9.一棵二叉树满足下列条件:对任意结点,若存在左、右子树, 则其值都小于它的左子树上所有结点的值, 而大于右子树上所有结点的值。 现采用( )遍历方式就可以得到这棵二叉树所有结点的递减序列。A.前序B.中序C.后序D.层次 10.如图6-1所示的二叉树的中序遍历序列是( )。 A.abcdgef B.dfebagc C.dbaefcg D.defbagc

二叉排序树运算-数据结构与算法课程设计报告_l

合肥学院 计算机科学与技术系 课程设计报告 2009 ~2010 学年第二学期 课程 数据结构与算法 课程设计 名称 二叉排序树运算学生姓名顾成方 学号0704011033 专业班级08计科(2) 指导教师王昆仑张贯虹 2010 年 5 月

题目:(二叉排序树运算问题)设计程序完成如下要求:对一组数据构造二叉排序树,并在二叉排序树中实现多种方式的查找。基本任务:⑴选择合适的储存结构构造二叉排序树;⑵对二叉排序树T作中序遍历,输出结果;⑶在二叉排序树中实现多种方式的查找,并给出二叉排序树中插入和删除的操作。 ⑷尽量给出“顺序和链式”两种不同结构下的操作,并比较。 一、问题分析和任务定义 本次程序需要完成如下要求:首先输入任一组数据,使之构造成二叉排序树,并对其作中序遍历,然后输出遍历后的数据序列;其次,该二叉排序树能实现对数据(即二叉排序树的结点)的查找、插入和删除等基本操作。 实现本程序需要解决以下几个问题: 1、如何构造二叉排序树。 2、如何通过中序遍历输出二叉排序树。 3、如何实现多种查找。 4、如何实现插入删除等操作。 二叉排序树的定义:

⑴其左子树非空,则左子树上所有结点的值均小于根结点的值。 ⑵若其右子树非空,则右子树上所有结点的值大于根结点的值。 ⑶其左右子树也分别为二叉排序树。 本问题的关键在于对于二叉排序树的构造。根据上述二叉排序树二叉排序树的生成需要通过插入算法来实现:输入(插入)的第一个数据即为根结点;继续插入,当插入的新结点的关键值小于根结点的值时就作为左孩子,当插入的新结点的关键值大于根结点的值时就作为右孩子;在左右子树中插入方法与整个二叉排序树相同。当二叉排序树建立完成后,要插入新的数据时,要先判断已建立的二叉排序树序列中是否已有当前插入数据。因此,插入算法还要包括对数据的查找判断过程。 本问题的难点在于二叉排序树的删除算法的实现。删除前,首先要进行查找,判断给出的结点是否已存在于二叉排序树之中;在删除时,为了保证删除结点后的二叉树仍为二叉排序树,要考虑各种情况,选择正确

实现二叉排序树的各种算法

wyf 实现二叉排序树的各种算法 一.需求分析 (1)系统概述: 本系统是针对排序二叉树设计的各种算法,提供的功能包括有:(1)插入新结点(2)前序、中序、后序遍历二叉树(3)中序遍历的非递归算法(4)层次遍历二叉树(5)在二叉树中查找给定关键字(函数返回值为成功1,失败0) 二.总体设计 (1)系统模块结构图

(2)数据结构设计 typedef struct BiTNode{ ElemType data; struct BiTNode *lchild,*rchild;//左右孩子指针} BiTNode,*BiTree; typedef BiTree SElemType; typedef BiTree QElemType; typedef struct {

QElemType *base; // 初始化的动态分配存储空间 int front; // 头指针,若队列不空,指向队列头元素 int rear; // 尾指针,若队列不空,指向队列尾元素的下一个位置 }SqQueue; typedef struct { SElemType *base; // 在栈构造之前和销毁之后,base的值为NULL SElemType *top; // 栈顶指针 int stacksize; // 当前已分配的存储空间,以元素为单位 }SqStack; // 顺序栈 Status InitStack(SqStack &S) { // 构造一个空栈S,该栈预定义大小为STACK_INIT_SIZE // 请补全代码 S.base = (SElemType * )malloc(STACK_INIT_SIZE * sizeof(SElemType)); if(!S.base) return (ERROR); S.top = S.base ;

第6章 树和二叉树_作业(1)

第六章树和二叉树 1 一、选择题 1. 已知一算术表达式的中缀形式为A+B*C-D/E,后缀形式为ABC*+DE/-,其前缀形式为( ) A.-A+B*C/DE B.-A+B*CD/E C.-+*ABC/DE D.-+A*BC/DE 2. 在下述结论中,正确的是() ①只有一个结点的二叉树的度为0; ②二叉树的度为2; ③二叉树的左右子树可任意交换; ④深度为K的完全二叉树的结点个数小于或等于深度相同的满二叉树。 A.①②③B.②③④C.②④D.①④ 3. 设树T的度为4,其中度为1,2,3和4的结点个数分别为4,2,1,1 则T中的叶子数为() A.5 B.6 C.7 D.8 4. 设森林F对应的二叉树为B,它有m个结点,B的根为p,p的右子树结点个数为n,森林F中第一棵树的结点个数是() A.m-n B.m-n-1 C.n+1 D.条件不足,无法确定 5. 若一棵二叉树具有10个度为2的结点,5个度为1的结点,则度为0的结点个数是() A.9 B.11 C.15 D.不确定 6. 设森林F中有三棵树,第一,第二,第三棵树的结点个数分别为M1,M2和M3。与森林F对应的二叉树根结点的右子树上的结点个数是()。

A.M1 B.M1+M2 C.M3 D.M2+M3 7.有关二叉树下列说法正确的是() A.二叉树的度为2 B.一棵二叉树的度可以小于2 C.二叉树中至少有一个结点的度为2 D.二叉树中任何一个结点的度都为2 8. 一棵完全二叉树上有1001个结点,其中叶子结点的个数是()。 A.250 B.500 C.254 D.505 E.以上答案都不对 9. 具有10个叶结点的二叉树中有()个度为2的结点。 A.8 B.9 C.10 D.ll 10. 深度为h的满m叉树的第k层有()个结点。(1=

数据结构课程设计报告二叉排序树的实现

课程设计 课程名称数据结构课程设计 题目名称二叉排序树的实现 学院应用数学学院 专业班级 学号 学生 指导教师 2013 年 12 月 26 日

1.设计任务 1)实现二叉排序树,包括生成、插入,删除; 2)对二叉排序树进行先根、中根、和后根非递归遍历; 3)每次对树的修改操作和遍历操作的显示结果都需要在屏幕上 用树的形状表示出来。 4)分别用二叉排序树和数组去存储一个班(50人以上)的成员信 息(至少包括学号、、成绩3项),对比查找效率,并说明 为什么二叉排序树效率高(或者低)。 2. 函数模块: 2.1.主函数main模块功能 1.通过bstree CreatTree()操作建立二叉排序树。 2.在二叉排序树t过操作bstree InsertBST(bstree t,int key,nametype name,double grade)插入一个节点。 3. 从二叉排序树t过操作void Delete(bstree &p)删除任意节点。 4. 在二叉排序树t过操作bstnode *SearchBST(bstree t,keytype key)查 找节点。 5. 在二叉排序树t过操作p=SearchBST(t,key)查询,并修改节点信息 6. 非递归遍历二叉排序树。 7. 定义函数void compare()对数组和二叉排序树的查找效率进行比较比 较。 2.2创建二叉排序树CreatTree模块 从键盘中输入关键字及记录,并同时调用插入函数并不断进行插入。最后,返回根节点T。 2.3删除模块: 二叉排序树上删除一个阶段相当于删去有序系列中的一个记录,只要在删除某个节点之后依旧保持二叉排序树的性质即可。假设二叉排序树上删除节点为*p(指向节点的指针为p),其双亲节点为*f(节点指针为f)。若*p节点为叶子节点,则即左右均为空树,由于删去叶子节点不破坏整棵树的结构,则只需修改其双亲节点的指针即可;若*p节点只有左子树或只有右子树,此时只要令左子树或右子树直接成为其双亲节点*f的左子树即可;若*p节点的左子树和右子树均不为空,其一可以令*p的左子树为*f的左子树,而*p的右子树为*s的右子树,其二可以令*p的直接前驱(或直接后继)替代*p,然后再从二叉排序树中删去它的直接前驱(或直接后继)。在二叉排序树中删除一个节点的算法为 void DeleteData(bstree &t,keytype key) 若二叉排序树t中存在关键字等于key的数据元素,则删除该数据元素节点,并返回TRUE,否则返回FALSE。 2.4插入模块 二叉排序树是一种动态树表,其特点是树的结构通常不是一次生成的,而是在查找的过程中,当树中不存在关键字等于给定值得节点时在进行插入。

《二叉排序树的操作》课程设计报告

内蒙古科技大学 本科生课程设计论文《数据结构与算法》 题目:二叉排序树的操作 学生姓名:贺英杰 学号:1367159108 专业:软件工程 班级:13-1班 指导教师:周李涌 日期:2015年1月6日

内蒙古科技大学课程设计任务书课程名称数据结构与算法课程设计 设计题目二叉排序树的操作 指导教师周李涌时间2015.1.5——2015.1.9 一、教学要求 1. 掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力 2. 初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能 3. 提高综合运用所学的理论知识和方法独立分析和解决问题的能力 4. 训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风 二、设计资料及参数 每个学生在教师提供的课程设计题目中任意选择一题,独立完成,题目选定后不可更换。 二叉排序树的操作 以二叉链表表示二叉排序树,在此基础上实现二叉排序树的操作。 要求设计类(或类模板)来描述二叉排序树,包含必要的构造函数和析构函数,以及其他能够完成如下功能的成员函数: 创建二叉排序树 输出二叉排序树 在二叉排序树中查找给定值 在二叉排序树中插入新结点 在二叉排序树中删除给定值 并设计主函数测试该类(或类模板)。 三、设计要求及成果 1. 分析课程设计题目的要求 2. 写出详细设计说明 3. 编写程序代码,调试程序使其能正确运行 4. 设计完成的软件要便于操作和使用 5. 设计完成后提交课程设计报告 四、进度安排 资料查阅与讨论(1天) 系统分析(2天) 系统的开发与测试(5天) 编写课程设计说明书和验收(2天) 五、评分标准 1. 根据平时上机考勤、表现和进度,教师将每天点名和检查 2. 根据课程设计完成情况,必须有可运行的软件。 3. 根据课程设计报告的质量,如有雷同,则所有雷同的所有人均判为不及格。 4. 根据答辩的情况,应能够以清晰的思路和准确、简练的语言叙述自己的设计和回答教师的提问 六、建议参考资料 1.《数据结构(C语言版)》严蔚敏、吴伟民主编清华大学出版社2004.11 2.《数据结构课程设计案例精编(用C/C++描述)》,李建学等编著,清华大学出版社 2007.2 3.《数据结构:用面向对象方法与C++语言描述》,殷人昆主编,清华大学出版社 2007.6

数据结构课程设计---二叉排序树和平衡二叉树的判别

数据结构课程设计---二叉排序树和平衡二叉树的判别

二叉排序树和平衡二叉树的判别 1引言 数据结构是软件工程的一门核心专业基础课程,在我们专业的课程体系中起着承上启下的作用,学好数据结构对于提高理论认知水平和实践能力有着极为重要的作用。学习数据结构的最终目的是为了获得求解问题的能力。对于现实世界中的问题,应该能从中抽象出一个适当的数据模型,该数学模型在计算机内部用相应的数据结构来表示,然后设计一个解此数学模型的算法,在进行编程调试,最后获得问题的解答。 本次课程设计的题目是对二叉排序树和平衡二叉树的扩展延伸应用。首先我们得建立一个二叉树,二叉树有顺序存储结构和链式存储结构两种存储结构,此次我选用的是二叉链表的存储结构。对于判断平衡二叉树,需要求出其每个叶子结点所在的层数,这里我采用的边遍历边求的方式,遍历采用的是先序遍历。二叉树的建立以及二叉排序树和平衡二叉树的判别中都用到了递归思想。 2需求分析 2.1在日常生活中,人们几乎每天都要进行“查找”工作。所谓“查找”即为 在一个含有众多的数据元素(或记录)的查找表中找出某个“特定的”数据元素(或记录),即关键字。 2.2本程序意为对一个已经建立的动态查找表——二叉树——判断其是否是二 叉排序树和平衡二叉树。 3数据结构设计 3.1抽象数据类型二叉树的定义如下: ADT BinaryTree{ 3.1.1数据对象D:D是具有相同特性的数据元素的集合。 3.1.2数据关系R: 若D=NULL,则R=NULL,称BinaryTree为空的二叉树; 若D!=NULL,则R={H},H是如下的二元关系: 3.1.2.1在D中存在唯一的称为根的数据元素root,它在关系H下无前驱; 3.1.2.2若D-{root}!=NULL,则存在D-{root}={Dl,Dr},且Dl与Dr相交为空; 3.1.2.3若Dl!=NULL,则Dl中存在唯一的元素xl,属于H,且存在Dl上的关系Hl属于H;若Dr!=NULL,则Dr中存在唯一的元素xr,

习题6树和二叉树.docx

习题6树和二叉树 说明: 本文档中,凡红色字标出的题请提交纸质作业,只写题号和答案即可。 6.1单项选择题 1. 由于二叉树屮每个结点的度最大为2,所以二叉树是一种特殊的树,这种说法_B_。 A. 正确 B.错误 2. 假定在一棵二叉树屮,双分支结点数为15,单分支结点数为30个,则叶子结点数为 B_个。 A. 15 B. 16 C. 17 D. 47 3. 按照二叉树的定义,具有3个结点的不同形状的二叉树有_C_种。 A. 3 B.4 C. 5 D. 6 4. 按照二叉树的定义,具有3个不同数据结点的不同的二叉树有_C_种。 A.5 B.6 C. 30 D. 32 5. 深度为5的二叉树至多有_C_个结点。 A. 16 B. 32 C. 31 D. 10 6. 设高度为h 的二叉树上只有度为0和度为2的结点,则此类二叉树中所包含的结点 数至少为 B 。 A. 2h B. 2h-l C. 2h+l D. h+l 7. 对一个满二叉树,m 个树叶,n 个结点,深度为h,则_A_。 A. n=h+m B. h+m=2n C. m=h-1 D. n=2 h -l 8. 任何一棵二叉树的叶结点在先序、中序和后序遍历序列中的相对次序_A_。 A.不发生改变 B.发生改变 C.不能确定 D.以上都不对 9. 如杲某二叉树的前根次序遍历结果为stuwv,中序遍历为uwtvs,那么该二叉树的后 序为_C_。 A. uwvts B. vwuts C. wuvts D. wutsv 10. 二叉树的前序遍历序列中,任意一个结点均处在其子女结点的前面,这种说法_A_。 A.正确 B.错误 11. 某二叉树的前序遍历结点访问顺序是abdgcefh,中序遍历的结点访问顺序是 dgbaechf,则其后序遍历的结点访问顺序是_D_。 A. bdgcefha B. gdbecfha 12. 在一非空二叉树的中序遍历序列中, A.只有右子树上的所有结点 13. 如图6.1所示二叉树的中序遍历序列是_B_。 14. 一棵二叉树如图6.2所示,其中序遍历的序列为 B 。 A. abdgcefh B. dgbaechf C. gdbehfca D. abcdefgh C. bdgaechf D. gdbehfca 根结点的右边_A_。 B.只有右子树上的部分结点 C.只有左子树上的部分结点 D.只有左子树上的所有结点 A. abcdgef B. dfebagc C. dbaefcg D. defbagc 图6」

二叉树的各种算法

二叉树的各种算法.txt男人的承诺就像80岁老太太的牙齿,很少有真的。你嗜烟成性的时候,只有三种人会高兴,医生你的仇人和卖香烟的。 /*用函数实现如下二叉排序树算法: (1)插入新结点 (2)前序、中序、后序遍历二叉树 (3)中序遍历的非递归算法 (4)层次遍历二叉树 (5)在二叉树中查找给定关键字(函数返回值为成功1,失败0) (6)交换各结点的左右子树 (7)求二叉树的深度 (8)叶子结点数 Input 第一行:准备建树的结点个数n 第二行:输入n个整数,用空格分隔 第三行:输入待查找的关键字 第四行:输入待查找的关键字 第五行:输入待插入的关键字 Output 第一行:二叉树的先序遍历序列 第二行:二叉树的中序遍历序列 第三行:二叉树的后序遍历序列 第四行:查找结果 第五行:查找结果 第六行~第八行:插入新结点后的二叉树的先、中、序遍历序列 第九行:插入新结点后的二叉树的中序遍历序列(非递归算法) 第十行:插入新结点后的二叉树的层次遍历序列 第十一行~第十三行:第一次交换各结点的左右子树后的先、中、后序遍历序列 第十四行~第十六行:第二次交换各结点的左右子树后的先、中、后序遍历序列 第十七行:二叉树的深度 第十八行:叶子结点数 */ #include "stdio.h" #include "malloc.h" #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0

#define INFEASIBLE -1 #define OVERFLOW -2 typedef int Status; typedef int KeyType; #define STACK_INIT_SIZE 100 // 存储空间初始分配量 #define STACKINCREMENT 10 // 存储空间分配增量 #define MAXQSIZE 100 typedef int ElemType; typedef struct BiTNode{ ElemType data; struct BiTNode *lchild,*rchild;//左右孩子指针 } BiTNode,*BiTree; Status SearchBST(BiTree T,KeyType key,BiTree f,BiTree &p) { if(!T){p=f;return FALSE;} else if(key==T->data){p=T;return TRUE;} else if(keydata)return SearchBST(T->lchild,key,T,p); else return(SearchBST(T->rchild,key,T,p)); } Status InsertBST(BiTree &T,ElemType e) { BiTree s,p; if(!SearchBST(T,e,NULL,p)) { s=(BiTree)malloc(sizeof(BiTNode)); s->data=e;s->lchild=s->rchild=NULL; if(!p)T=s; else if(edata)p->lchild=s; else p->rchild=s; return TRUE; } else return FALSE; } Status PrintElement( ElemType e ) { // 输出元素e的值 printf("%d ", e ); return OK; }// PrintElement

作业-树和二叉树

作业-树和二叉树

树 (树根结点的高度为1) 一、选择题 3.以下说法错误的是( )。 A.完全二叉树上结点之间的父子关系可由它们编号之间的关系来表达 B.在三叉链表上,二叉树的求双亲操作很容易实现 C.在二叉链表上,求根以及求左、右孩子等操作很容易实现 D.在二叉链表上,求双亲操作的时间性能很好4.以下说法错误的是( )。 A.一般在哈夫曼树中,权值越大的叶子离根结点越近 B.哈夫曼树中没有度数为1的分支结点C.若初始森林中共有n棵二叉树,最终求得的哈夫曼树共有2n-1个结点 D.若初始森林中共有n棵二叉树, 进行2n-1次合并后才能剩下一棵最终的哈夫曼树 5.深度为6的二叉树最多有( )个结点。A.64 B.63 C.32 D.31

6.将含有41个结点的完全二叉树从根结点开始编号,根为1号, 后面按从上到下、从左到右的顺序对结点编号,那么编号为21的双亲结点编号为( )。 A.10B.11 C.41 D.20 7.设深度为k的二叉树上只有度为0和度为2的结点, 则这类二叉树上所含结点总数最少( )个。A.k+l B.2k C.2k-1D.2k+1 8.下列说法中正确的是( )。 A.任何一棵二叉树中至少有一个结点的度为2 B.任何一棵二叉树中每个结点的度都为2 C.任何一棵二叉树中的每个结点的度肯定等于2 D.任何一棵二叉树中的每个结点的度都可以小于2 9.一棵二叉树满足下列条件:对任意结点,若存在左、右子树, 则其值都小于它的左子树上所有结点的值, 而大于右子树上所有结点的值。

现采用( )遍历方式就可以得到这棵二叉树所有结点的递减序列。 A.前序B.中序C.后序D.层次 10.如图6-1所示的二叉树的中序遍历序列是( )。 A.abcdgef B.dfebagc C.dbaefcg D.defbagc 11.已知某二叉树的后序遍历序列是deacb,中序遍历序列是deabc, 它的前序遍历序列是( )。 A.acbed B.baedc C.dceab D.cedba 12.某二叉树的前序遍历的结点访问顺序是abdgcefh, 中序遍历的结点访问顺序是dgbaechf, 则其后序遍历的结点访问顺序是( )。

数据结构实验三——二叉树基本操作及运算实验报告

《数据结构与数据库》 实验报告 实验题目 二叉树的基本操作及运算 一、需要分析 问题描述: 实现二叉树(包括二叉排序树)的建立,并实现先序、中序、后序和按层次遍历,计算叶子结点数、树的深度、树的宽度,求树的非空子孙结点个数、度为2的结点数目、度为2的结点数目,以及二叉树常用运算。 问题分析: 二叉树树型结构是一类重要的非线性数据结构,对它的熟练掌握是学习数据结构的基本要求。由于二叉树的定义本身就是一种递归定义,所以二叉树的一些基本操作也可采用递归调用的方法。处理本问题,我觉得应该:

1、建立二叉树; 2、通过递归方法来遍历(先序、中序和后序)二叉树; 3、通过队列应用来实现对二叉树的层次遍历; 4、借用递归方法对二叉树进行一些基本操作,如:求叶子数、树的深度宽度等; 5、运用广义表对二叉树进行广义表形式的打印。 算法规定: 输入形式:为了方便操作,规定二叉树的元素类型都为字符型,允许各种字符类型的输入,没有元素的结点以空格输入表示,并且本实验是以先序顺序输入的。 输出形式:通过先序、中序和后序遍历的方法对树的各字符型元素进行遍历打印,再以广义表形式进行打印。对二叉树的一些运算结果以整型输出。 程序功能:实现对二叉树的先序、中序和后序遍历,层次遍历。计算叶子结点数、树的深度、树的宽度,求树的非空子孙结点个数、度为2的结点数目、度为2的结点数目。对二叉树的某个元素进行查找,对二叉树的某个结点进行删除。 测试数据:输入一:ABC□□DE□G□□F□□□(以□表示空格),查找5,删除E 预测结果:先序遍历ABCDEGF 中序遍历CBEGDFA 后序遍历CGEFDBA 层次遍历ABCDEFG 广义表打印A(B(C,D(E(,G),F))) 叶子数3 深度5 宽度2 非空子孙数6 度为2的数目2 度为1的数目2 查找5,成功,查找的元素为E 删除E后,以广义表形式打印A(B(C,D(,F))) 输入二:ABD□□EH□□□CF□G□□□(以□表示空格),查找10,删除B 预测结果:先序遍历ABDEHCFG 中序遍历DBHEAGFC 后序遍历DHEBGFCA 层次遍历ABCDEFHG 广义表打印A(B(D,E(H)),C(F(,G))) 叶子数3 深度4 宽度3 非空子孙数7 度为2的数目2 度为1的数目3 查找10,失败。

表达式用二叉树表示

数据结构程序报告(3) 2011.3.29

2. 需求分析: (1)功能:表达式可以用二叉树表示,对于简单的四则运算,请实现以下功能 【1】对于任意给出的前缀表达式(不带括号)、中缀表达式(可以带括号)或后缀表达式(不带括号),能够在计算机内部构造出一棵表达式二叉树,并且图示出来(图形的形式)。【2】对于构造好的内部表达式二叉树,按照用户的要求输出相应的前缀表达式(不带括号)、中缀表达式(可以带括号,但不允许冗余括)或后缀表达式(不带括号)。 提示:所谓中缀表达式中的冗余括号,就是去掉括号后不影响表达式的计算顺序。例如:“(c+b)+a”中的括号是冗余的,可以表示成不冗余的“c+b+a”。 (2)输入输出要求:请输入字符串表达式: 树形二叉树(图形显示) 中缀表达式为: 前缀表达式为: 后缀表达式为: 3.概要设计:(算法) 分成两部分完成: 【1】前缀、中缀、后缀表达式->二叉树表达式 前缀表达式->二叉树表达式:(a)碰到操作数则把其值赋给相应的新申请的二叉树结点,地址压栈;(b)碰到操作符则把其值赋给相应的新申请的二叉树,并从栈中弹出两个地址,分别作为其右指针和左指针,然后再把其地址压栈,最后一个地址即为二叉树的根结点地址。 中缀表达式->二叉树表达式:把中缀表达式转换成后缀表达式,然后再建立二叉树。

后缀表达式->二叉树表达式:(a)碰到操作数则把其值赋给相应的新申请的二叉树结点,若栈为空则地址压栈,若非空则取栈顶元素,若栈顶元素的左孩子为空则当前结点设为其左孩子,左孩子为满则设为其右孩子再压栈;(b)碰到操作数则把其值赋给相应的新申请的二叉树结点,取栈顶元素,若栈顶元素的左孩子为空则设为其左孩子,左孩子为满则设为其右孩子开始那个元素地址为根结点地址,开始时用变量root保存。 【1】二叉树表达式->前缀、中缀、后缀表达式 二叉树表达式->前缀表达式:对二叉树表达式进行前序遍历。 二叉树表达式->中缀表达式:对二叉树表达式进行中序遍历,若结点操作符的优先级高于其左或右子树,在打印相应的子树之前先打印开括号,在打印相应的子树最后在打印一个闭括号。 二叉树表达式->后缀表达式:对二叉树表达式进行后序遍历。

二叉排序树的实现_课程设计报告

中北大学 数据结构 课程设计说明书 2011年12月20日

1.设计任务概述:

功能描述: (1)以回车('\n')为输入结束标志,输入数列L,生成一棵二叉排序树T; (2)对二叉排序树T作中序遍历,输出结果; (3)输入元素x,查找二叉排序树T,若存在含x的结点,则删除该结点,并作中序遍历(执行操作2);否则输出信息“无x”。 2.本设计所采用的数据结构 二叉树及二叉链表 3.功能模块详细设计 详细设计思想 建立二叉排序树采用边查找边插入的方式。查找函数采用递归的方式进行查找。如果查找到相等的则插入其左子树。然后利用插入函数将该元素插入原树。 对二叉树进行中序遍历采用递归函数的方式。在根结点不为空的情况下,先访问左子树,再访问根结点,最后访问右子树。 删除结点函数,采用边查找边删除的方式。如果没有查找到,进行提示;如果查找到结点则将其左子树最右边的节点的数据传给它,然后删除其左子树最右边的节点。 核心代码 (1)主菜单模块 int main(){ LNode root=NULL; int Num,a,x; printf("\n\n *******************************\n"); printf(" ************主菜单*************\n"); printf(" *1:进行中序排列*\n"); printf(" *2:进行删除操作

*\n"); printf(" *3:退出*\n"); printf(" *******************************\n"); printf("请输入要进行操作的数字以0结束:\n"); 运行结果 (3)中序遍历模块 void view(LNode p){

二叉排序树与平衡二叉排序树基本操作的实现

编号:B04900083 学号:8 Array课程设计 教学院计算机学院 课程名称数据结构与算法 题目二叉排序树与平衡二叉排序树基本操 作的实现 专业计算机科学与技术 班级二班 姓名 同组人员 指导教师成俊 2015 年12 月27 日

课程设计任务书 2015 ~2016 学年第 1 学期 学生:专业班级:计科二 指导教师:成俊工作部门:计算机学院 一、课程设计题目:二叉排序树与平衡二叉排序树基本操作 二、课程设计容 用二叉链表作存储结构,编写程序实现二叉排序树上的基本操作:以回车('\n')为输入结束标志,输入数列L,生成二叉排序树T;对二叉排序树T作中序遍历;计算二叉排序树T的平均,输出结果;输入元素x,查找二叉排序树T,若存在含x的结点,则删除该结点,并作中序遍历;否则输出信息“无结点x”; 判断二叉排序树T是否为平衡二叉树;再用数列L,生成平衡二叉排序树BT:当插入新元素之后,发现当前的二叉排序树BT不是平衡二叉排序树,则立即将它转换成新的平衡二叉排序树BT;计算平衡的二叉排序树BT的平均查找长度,输出结果。 三、进度安排 1.分析问题,给出数学模型,选择数据结构. 2.设计算法,给出算法描述 3.给出源程序清单 4. 编辑、编译、调试源程序 5. 撰写课程设计报告 四、基本要求 编写AVL树判别程序,并判别一个二叉排序树是否为AVL树。二叉排序树用其先序遍历结果表示,如:5,2,1,3,7,8。 实现AVL树的ADT,包括其上的基本操作:结点的加入和删除;另外包括将一般二叉排序树转变为AVL树的操作。 实现提示主要考虑树的旋转操作。

目录 一、课程设计题目: 二叉排序树与平衡二叉排序树基本操作 (1) 二、课程设计容 (1) 三、进度安排 (1) 四、基本要求 (1) 一、概述 (3) 1.课程设计的目的 (3) 2.课程设计的要求 (3) 二、总体方案设计 (4) 三、详细设计 (6) 1.课程设计总体思想 (6) 2.模块划分 (7) 3.流程图 (8) 四、程序的调试与运行结果说明 (9) 五、课程设计总结 (14) 参考文献 (14)

相关文档
最新文档