1. 程式人生 > >資料結構 筆記:樹的定義與操作

資料結構 筆記:樹的定義與操作

樹是一種非線性的資料結構

樹是由n(n>=0)個結點組成的有限集合

-如果 n = 0,成為空樹;

-如果n > 0,則:

·有一個特定的稱之為根(root)的結點

·根據點只有直接後繼,但沒有直接前驅

·除根以外的其他結點劃分為m(m>=0)個互補相交的有限集合T0,T1,...,Tm-1,

每個集合又是一棵樹,並稱之為根的子樹(sub tree)

樹中度的概念

-樹的結點包含一個數據及若干指向子樹的分支

-結點擁有的子樹數目稱為結點的度

·度為0的結點成為葉結點

·度不為0的結點成為分支結點

-樹的度定義為所有結點中度的最大值

樹中的前驅和後繼

-結點的直接後繼稱為該結點的孩子

·相應的,該結點稱為孩子的雙親

-結點的孩子的孩子的.......稱為該結點的子孫

·相應的,該結點稱為子孫的祖先

-同一個雙親的孩子之間互稱兄弟

樹中結點的層次

樹的有序性

-如果樹中結點的各個樹從左向右是有次序的,子樹間不能互換位置,則稱該樹為有序樹,負責為無序樹。

森林的概念

-森林是由n(n>=0)顆互不相交的樹組成的結合

樹的一些常用操作

-將元素插入樹中

-將元素從樹中刪除

-獲取樹的結點樹

-獲取樹的高度

-獲取樹的度

-清空樹中的元素

-。。。

樹在程式中表現為一種特殊的資料型別

template <typename T>
class Tree : public Object
{
protected:
    TreeNode<T>* m_root;
public:
    Tree() {m_root = NULL ;}
    virtual bool insert(TreeNode<T>* node) = 0;
    virtual bool insert(const T& value,TreeNode<T>* parent) = 0;
    virtual SharedPointer<Tree<T>>remove(const T& value) = 0;
    virtual SharedPointer<Tree<T>>remove(TreeNode<T>* node) = 0;
    virtual TreeNode<T>* find(const T& value) const = 0;
    virtual TreeNode<T>* find(TreeNode<T>* node)const = 0;
    virtual TreeNode<T>* root() const = 0;
    virtual int degree() const = 0;
    virtual int count() const = 0;
    virtual int height() const = 0;
    virtual void clear() = 0;
};

樹中結點也表現為一種特殊的資料型別

template<typename T>
class TreeNode : public Object
{
public:
    T value;
    TreeNode<T>* parent;

    TreeNode()
    {
        parent = NULL;
    }

    virtual ~TreeNode() = 0;
};

總結:

-樹是一種非線性的資料結構

-結點擁有唯一的前驅(父結點)和若干後繼(子結點)

-樹的結點包含一個數據及若干指其他結點的指標

-樹與結點在程式中表現為特殊的資料型別