資料結構 筆記:樹的定義與操作
阿新 • • 發佈:2018-11-12
樹是一種非線性的資料結構
樹是由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;
};
總結:
-樹是一種非線性的資料結構
-結點擁有唯一的前驅(父結點)和若干後繼(子結點)
-樹的結點包含一個數據及若干指其他結點的指標
-樹與結點在程式中表現為特殊的資料型別