資料結構基礎 16 樹與二叉樹

2021-09-21 16:11:45 字數 3198 閱讀 3293

1.結點:

2.結點的度:分支的個數(子樹的個數)

3.樹的度:樹中所有結點的度的最大值

4.葉子結點:度為零的結點

5.分支結點:度大於零的結點(包含根和中間結點)

6.(從根到結點的)路徑:由從根到該結點所經分支和結點構成;

7.結點的層次:假設根結點的層次為1,則根的孩子為第2層,如果某節點在第l層,則其子樹的根在l+1層。

8.樹的深度:樹中葉子結點所在的最大層次;

二叉樹或為空樹,或是由乙個根結點加上兩棵分別稱為左子樹和右子樹的、互不交的二叉樹組成。(樹的度最大為2)

二叉樹的重要性質:

性質1:在二叉樹的第i層上至多有2^(i-1)個結點(i≥1);

性質2:深度為 k 的二叉樹上至多含 (2^k)-1個結點(k≥1);

性質3:對任何一棵二叉樹,若它含有n0 個葉子結點(0度結點)、n2 個度為 2的結點,則必存在關係式:n0 = n2+1。

兩類特殊的二叉樹:

滿二叉樹:指的是深度為k且含有(2^k)-1個結點的二叉樹。

完全二叉樹:樹中所含的 n 個結點和滿二叉樹中編號為 1 至 n 的結點一一對應。(編號的規則為,由上到下,從左到右。如上圖所示)

完全二叉樹的特點:

1.葉子節點出現在最後2層

2.對於任意結點,若其右分支下的子孫的最大層次為l,則左分支下的子孫的最大層次為l或l+1;

性質4:具有n個結點的完全二叉樹的深度為[logn](向下取整)+1。

性質5:

若對含 

n 個結點的完全二叉樹從上到下且從左至右進行 

1 至 

n 的編號,則對完全二叉樹中任意乙個編號為 

i 的結點:

(1) 若 i=1,則該結點是二叉樹的根,無雙親,否則,編號為 [i/2](向下取整)的結點為其雙親結點;

(2) 若 2i>n,則該結點無左孩子,否則,編號為 2i 的結點為其左孩子結點;

(3) 若 2i+1>n,則該結點無右孩子結點,否則,編號為2i+1 的結點為其右孩子結點。

說明:

由於這篇部落格僅僅是為了演示二叉樹的理論, 因此**所做的封裝性以及可用性都不理想, 但由於在實際應用中, 也基本上不可能這樣直接的使用二叉樹, 因此也就沒怎麼優化他, 在此首先給大家說聲抱歉;

二叉樹節點構造

template class treenode

type data;

treenode *leftchild;

treenode *rightchild;

};

二叉樹構造:

template class binarytree

bool isempty() const

//先序遍歷

void preorder() const

//中序遍歷

void inorder() const

//後續遍歷

void postorder() const

//層次遍歷

void levelorder() const;

private:

void preorder(const treenode*rootnode) const;

void inorder(const treenode*rootnode) const;

void postorder(const treenode*rootnode) const;

void visit(const treenode*node) const;

//因為此處僅僅是為了演示, 因此將之定義為public

public:

treenode*root;

};

先(根)序的遍歷演算法:1.若二叉樹為空,則直接返回;

2.否則

(1)訪問根結點(visit);

(2)先序遍歷左子樹;

(3)先序遍歷右子樹;

//實現

template void binarytree::preorder(const treenode*subtree) const

}

中(根)序的遍歷演算法:1.若二叉樹為空樹,則空操作;

2.否則

(1)中序遍歷左子樹;

(2)訪問根結點;

(3)中序遍歷右子樹。

//實現

template void binarytree::inorder(const treenode*subtree)const

}

後(根)序的遍歷演算法:1.若二叉樹為空樹,則空操作;

2.否則

(1)後序遍歷左子樹;

(2)後序遍歷右子樹;

(3)訪問根結點。

//實現

template void binarytree::postorder(const treenode*subtree)const

}

層次遍歷演算法與visit操作:

template void binarytree::levelorder() const

}

template void binarytree::visit(const treenode*currentnode) const

二叉樹構造與運用示例構造一顆如下的二叉樹:

//**如下

int main()

遍歷演算法的應用舉例1.統計二叉樹中葉子結點的個數(先序遍歷)

2.求二叉樹的深度(後序遍歷)

3.複製二叉樹(後序遍歷)

資料結構 樹與二叉樹

一 性質 1 在二叉樹中,第i層的結點總數不超過2 i 1 2 深度為h的二叉樹最多有2 h 1個結點 h 1 最少有h個結點 3 對於任意一棵二叉樹,如果其葉結點數為n0,而度數為2的結點總數為n2,則n0 n2 1 4 具有n個結點的完全二叉樹的深度為int log2n 1 5 給定n個節點,能...

資料結構 樹與二叉樹

1 樹的定義 樹是一種 非線性的資料結構。樹是n n 0 個結點的有限集,在任意一棵非空樹中 1 有且僅有乙個特定的被稱為 根 root 的結點 2 當n 1時,其餘結點可分為m m 0 個互不相交的有限集,其中每個集合本身又是一棵樹,並且稱為根的 子樹 subtree 3 每棵子樹也是由唯一的根結...

資料結構 樹與二叉樹

樹是一類重要的非線性資料結構,是以分支關係定義的層次結構 定義 樹 tree 是n n 0 個結點的有限集t,其中 有且僅有乙個特定的結點,稱為樹的根 root 當n 1時,其餘結點可分為m m 0 個互不相交的有限集t1,t2,tm,其中每乙個集合本身又是一棵樹,稱為根的子樹 subtree 特點...