20120919-二叉树 数据结构《数据结构与算法分析》

又是一次的毕业季,羡慕嫉妒啊....

二叉查找树类的框架:

 1 template <typename Comparable>
 2 class BinarySearchTree
 3 {
 4 public:
 5     BinarySearchTree();
 6     BinarySearchTree(const BinarySearchTree & rhs)
 7     ~BinarySearchTree();
 8
 9     const Comparable & findMin() const;
10     const Comparable & findMax() const;
11
12     bool contains(const Comparable & x ) const;
13     bool isEmpty() const;
14     void printTree() const;
15
16     void makeEmpty();
17     void insert(const Comparable & x);
18     void remove(const Comparable & x);
19
20     const BinarySearchTree & operator = (const BinarySearchTree & rhs);
21
22 private:
23     struct BinaryNode
24     {
25         Comparable element;
26         BinaryNode *left;
27         BinaryNode *right;
28
29         BinaryNode(const  Comparable & theElement,BinaryNode *lt,BinaryNode *rt):element(theElement),left(lt),right(rt){}
30     };
31
32     BinaryNode *root;
33
34     void insert (const Comparable & x,BinaryNode * & t) const;
35     void remove (const Comparable & x ,BinaryNode * & t) const;
36     BinaryNode * findMin(BinaryNode *t) const;
37     BinaryNode * findMax(BinaryNode *t) const;
38     bool contains( const Comparable & x,BinaryNode * t) const;
39     void makeEmpty( BinaryNode * & t);
40     void printTree(BinaryNode *t) const;
41     BinaryNode * clone(BinaryNode *t) const;
42 };

contains    insert   remove三种操作递归列表:

bool contains (const Comparable & x) const
{
    return contains(x,root)
}
void insert(const Comparable & x)
{
    insert (x,root);
}
void remove(const Comparable & x)
{
    remove(x,root);
}

二叉查找树的contains操作:

 1 bool contains(const Comparable & x,BinaryNode * t) const
 2 {
 3     if( t == NUll )
 4         return false;
 5     else if ( x < t->element )
 6         return contains(x,t->left );
 7     else if (t->element < t)
 8         return contains(x,t->right);
 9     else
10         return true;
11 }

 

使用函数对象 实现 二叉查找树:

template <typename Object,typename Comparator = less<Object>>
class BinarySearchTree
{
    public:
    private:
        BinaryNode * root;
        Comparable isLessThan;

        bool contains( const Object & x,BinaryNode *t ) const
        {
            if(t == NULL)
                return false;
            else if (isLessThan(x,t->element))
                return contains(x,t->left);
            else if (isLessThan(t->element,x))
                return contains(x,t->right);
            else
                return true;
        }
};

findMin方法的递归实现:

1 BinaryNode * findMin( BinaryNode * t) const
2 {
3     if( t == NULL)
4         return NULL;
5     if(t->left == NULL)
6         return t;
7     return findMin(t->left);
8 }

findMax方法的递归实现:

1 BinaryNode * findMax(BinaryNode * t) const
2 {
3     if(t != NULL)
4         while( t ->right !=NULL)
5             t = t->right;
6     return t;
7 }

二叉查找树插入操作:

 1 void insert( const Comparable & x,BinaryNode * & t )
 2 {
 3     if( t== NULL)
 4         t = new BinaryNode(x,NULL,NULL);
 5     else if (x<t->element)
 6         insert(x,t->left);
 7     else if (t->element < x)
 8         insert(x,t->right);
 9     else
10         ;
11 }

二叉查找树 删除操作:

 1 void remove (const Comparable & x,BinaryNode * & t)
 2 {
 3     if( t == NULL)
 4         return;
 5     if( x <  t->element)
 6         remove( x,t->left);
 7     else if ( t->element < x)
 8         remove(x,t->right);
 9     else if (t->left != NULL && t->right!=NULL )
10     {
11         t->element = findMin( t->right)->element;
12         remove(t->element , t->right);
13     }
14     else
15     {
16         BinaryNode *oldNode = t;
17         t = ( t->left !=NULL) ? t->left : t->right;
18         delete oldNode;
19     }
20 }

析构函数递归实现makeEmpty

~BinarySearchTree()
{
    makEmpty();
}
void makeEmpty(BinaryNode * & t)
{
    if( t != NULL)
    {
        makeEmpty(t->left);
        makeEmpty(t->right);
        delete t;
    }
    t = NULL;
}

operator= 递归实现clone:

 1 const BinarySearchTree & operator=( const BianrySearchTree & rhs)
 2 {
 3     if(this != &rhs)
 4     {
 5         makeEmpty();
 6         root = clone(rhs.root);
 7     }
 8     return *this;
 9 }
10
11 BinaryNode * clone( BinaryNode * t) const
12 {
13     if( t == NULL)
14         return NULL;
15     return new BinaryNode ( t->element,clone(t->left),clone(t->right));
16 }

本文转自博客园xingoo的博客,原文链接:20120919-二叉树 数据结构《数据结构与算法分析》,如需转载请自行联系原博主。

时间: 2024-10-09 09:16:14

20120919-二叉树 数据结构《数据结构与算法分析》的相关文章

实现二叉树以及二叉树遍历数据结构

本文讲的是实现二叉树以及二叉树遍历数据结构, Swift 算法俱乐部 是一个致力于使用 Swift 来实现数据结构和算法的一个开源项目. 每个月,我和 Chris Pilcher 会在俱乐部网站上开建一个教程,来实现一个炫酷的数据结构或者算法.如果你想要去学习更多关于算法和数据结构的知识,请跟随我们的脚步吧. 在这个教程里面,你将学习到关于二叉树和二叉搜索树的知识.二叉树的实现首先是由 Matthijs Hollemans 实现的,而二叉搜索树是由 Nico Ameghino 实现的. 提示: 

Python数据结构与算法--算法分析

一个有趣的问题经常出现,那就是两个看似不同的程序,到底哪个更好呢? 要回答这个问题, 我们必须知道程序和代表程序的算法有很大的区别. 算法是一个通用的, 解决问题的一条条的指令. 提供一个解决任何具有指定输入的实例问题方法, 算法产生期望的结果. 一个程序, 另一方面, 是将算法用某一门编程语言代码实现. 有很多的程序实现的同一算法, 取决于程序员和编程语言的使用. 进一步的探究这种差异, 考察下面的函数代码. 这个函数解决一个简单的问题, 计算前n个自然数的和. 解决方案遍历这 n 个整数,

c++ 数据结构-数据结构用树结构设计家谱

问题描述 数据结构用树结构设计家谱 家庭成员的管理问题 (2-3人) 1.问题描述: 例如有这样的一对老夫妻(A.B),他们生有n男m女,其中,某个儿子(D)娶妻(C)生有x男y女,某个女儿(E)嫁夫(F)生有i男j女,其余的子女有可能婚嫁,也有可能单身,已婚的可能生有孩子若干,其孩子相继婚嫁-- 2.基本要求: 数据对象是以上所有的家庭成员,要求建立他们之间的夫妻.子女等关系并方便查询. [测试数据] 按时间顺序建立家庭关系: 按姓名查询某个家庭成员及其配偶和孩子. 用多叉树和兄弟链表设计,不

c++ 数据结构-数据结构c++单链表问题 急!!

问题描述 数据结构c++单链表问题 急!! 5C SinglyList& operator*=(SinglyList &list) //仅保留那些也包含在list中的元素,集合交 解决方案 单链表逆序的C++实现 解决方案二: http://ask.csdn.net/questions/253462

c语言 数据结构-数据结构——二叉排序树

问题描述 数据结构--二叉排序树 给定关键字序列:63 90 70 55 67 42 98 83 10 45 58 要求:l.构建二叉排序树 2.对该树中序遍历,显示其序列 3.依次删除1042634.再次对该树中序遍历,显示其序列(运用C语言)

c语言 数据结构-数据结构课程设计停车厂c语言实现

问题描述 数据结构课程设计停车厂c语言实现 问题描述:设停车场是一个可停放n辆汽车的狭长通道,且只有一个门可供出入.汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆汽车即可开入:当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原顺序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时

求助数据结构-数据结构中数组元素存储地址的计算

问题描述 数据结构中数组元素存储地址的计算 数组A中,每个元素的长度为3个字节,行下标i从1到8,列下标j从1到10,从兽地址开始连续存放的存储器内,该数组按行存放,元素A[8][5]的起始地址为() A.Sa+141 B.SA+144 C.SA+222 D.SA+225 答案是C啊,求大神说一下怎么算,要具体过程,谢谢了 解决方案 即使A[8][5]前面有多少个元素, 行下标i从1到8,列下标j从1到10,所有A[8][5]之前共有7*10+4(74)个元素, 每个元素的长度为3个字节,故共有

c++ 数据结构-数据结构c++循环单链表问题,急!!

问题描述 数据结构c++循环单链表问题,急!! CirSinglyList& operator+=(CirSinglyList &list) //尾插入list,集合并 解决方案 CirSinglyList& operator+=(CirSinglyList &list) { CirSinglyList *p = this; while(p->next != NULL) p = p->next; while(list->next != NULL) { p-

检查一个二叉树是否平衡的算法分析与C++实现

今天面试一个实习生,就想既然是未出校园,那就出一个比较基础的题吧,没想到答的并不如人意,对于树的操作完全不熟悉,因此此题算是未作答.原来我想看一下他分析问题的思路,优化代码的能力.接下来会把最近半年我出的面试题整理出来,以来share给其它同事,而来算是自己校园记忆的一个总结,毕竟自己在项目中已经很久未用到这些知识.其实很多题目都是来源于CareerCup.com.这上面汇集了许多IT名企的面试笔试题目,非常值得找工作的人学习. 言归正传,什么是二叉树是否平衡的定义,如果面试者不知道,那肯定要提

数据结构的C++实现之二叉树的遍历和存储结构

在<二叉树的定义和性质>中我们已经认识了二叉树这种数据结构.我们知道链表的每个节点可以有一个后继,而二叉 树(Binary Tree)的每个节点可以有两个后继.比如这样定义二叉树的节点: typedef struct node *link; struct node { unsigned char item; link l, r; }; 这样的节点可以组织成 下图所示的形态. 二叉树可以这样递归地定义: 1. 就像链表有头指针一样,每个二叉树都有一个根指针(上图中的root指针)指向它 .根指针