【數據結構】51_樹的定義與操做

樹的定義

  • 樹是一種非線性數據結構
  • 樹是由 n(n>=0) 個節點組成的有限集合node

    • 若是 n = 0, 稱爲空樹;
    • 若是 n > 0, 則:編程

      • 有一個特定的稱之爲根(root)的節點
      • 根節點只有直接後繼,但沒有直接前驅
      • 除根之外的其它節點劃分爲m(m>=0)個互不相交的有限集合T0,T1,...,Tm-1,每一個集合又是一顆樹,而且稱之爲根的子樹(sub tree)

樹的示例

image.png

樹中度的概念

  • 樹的節點包含一個數據及若干指向子樹的分支
  • 節點擁有的子樹數目稱爲節點的度數據結構

    • 度爲 0 的節點稱爲葉節點
    • 度不爲 0 的節點稱爲分支節點
  • 樹的度定義爲全部節點中度的最大值

樹的度的示例

度爲 3 的樹

image.png

樹中的前驅和後繼

  • 節點的直接後繼稱爲該節點的孩子spa

    • 相應的,該節點稱爲孩子的雙親
  • 節點的孩子的孩子的......稱爲該節點的子孫指針

    • 相應的,該節點稱爲子孫的祖先
  • 同一個雙親的孩子之間互稱爲兄弟

image.png

數中的節點層次

  • 根爲第 1 層
  • 根的孩子爲第 2 層
  • ...

image.png

樹中節點的最大層次稱爲樹的深度或高度code

樹的有序性

若是樹中節點的各子樹從左到右是有次序的,子樹之間不能互換位置,則稱爲該樹爲有序樹,不然爲無序樹。blog

image.png

森林的概念

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

image.png

樹的操做

  • 將元素插入數中
  • 將元素從樹中刪除
  • 在樹中查找元素
  • 獲取樹的節點數
  • 獲取數的高度
  • 獲取數的度
  • 清空數的元素

。。。rem

樹的數據結構

數在程序中表現爲一種特殊的數據類型
template <typename T>
class Tree : public Object
{
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;
    
protected:
    TreeNode<T> *m_root;
};

節點的數據結構

樹中的節點也表現爲一種特殊的數據類型
template <typename T>
class TreeNode : public Object
{
public:
    T value;
    TreeNode<T> *parent;
    
    TreeNode()
    {
        parent = NULL;
    }
    
    virtual ~TreeNode() = 0;
};

樹與節點的類關係

image.png

編程實驗:樹與節點抽象類的建立

文件:TreeNode.hit

#ifndef TREENODE_H
#define TREENODE_H

#include "Object.h"

namespace DTLib
{

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

    virtual ~TreeNode() = 0;
};

template <typename T>
TreeNode<T>::~TreeNode()
{

}

}

#endif // TREENODE_H

文件:Tree.hclass

#ifndef TREE_H
#define TREE_H

#include "Object.h"
#include "TreeNode.h"
#include "SharedPointer.h"

namespace DTLib
{

template <typename T>
class Tree : public Object
{
public:
    Tree() = default;
    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;

protected:
    TreeNode<T> *m_root = nullptr;
};

}

#endif // TREE_H

小結

  • 樹是一種特殊的數據結構
  • 節點擁有惟一前驅(父節點)和若干後繼(子節點)
  • 樹的節點包含一個數據及若干指向其它節點的指針
  • 樹與節點在程序中表現爲特殊的數據類型

以上內容整理於狄泰軟件學院系列課程,請你們保護原創!

相關文章
相關標籤/搜索