日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据结构基础(16) --树与二叉树

發布時間:2025/3/15 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构基础(16) --树与二叉树 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

樹的基本術語

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 <typename Type> class TreeNode {friend class BinaryTree<Type>; //因為此處僅僅是為了演示, 因此將之定義為public public:TreeNode(const Type &_data = Type(), TreeNode *_left = NULL, TreeNode *_right = NULL): data(_data), leftChild(_left), rightChild(_right) { }Type data;TreeNode *leftChild;TreeNode *rightChild; };

二叉樹構造:

template <typename Type> class BinaryTree { public://二叉樹可以進行的操作BinaryTree():root(NULL) {}bool isEmpty() const{return root == NULL;}//先序遍歷void preOrder() const{return preOrder(root);}//中序遍歷void inOrder() const{return inOrder(root);}//后續遍歷void postOrder() const{return postOrder(root);}//層次遍歷void levelOrder() const;private:void preOrder(const TreeNode<Type> *rootNode) const;void inOrder(const TreeNode<Type> *rootNode) const;void postOrder(const TreeNode<Type> *rootNode) const;void visit(const TreeNode<Type> *node) const;//因為此處僅僅是為了演示, 因此將之定義為public public:TreeNode<Type> *root; };

先(根)序的遍歷算法:

1.若二叉樹為空,則直接返回;

2.否則

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

? ? (2)先序遍歷左子樹;

? ? (3)先序遍歷右子樹;

//實現 template <typename Type> void BinaryTree<Type>::preOrder(const TreeNode<Type> *subTree) const {if (subTree != NULL){visit(subTree);preOrder(subTree->leftChild);preOrder(subTree->rightChild);} }

中(根)序的遍歷算法:

1.若二叉樹為空樹,則空操作;

2.否則

? ? (1)中序遍歷左子樹;

? ? (2)訪問根結點;

? ? (3)中序遍歷右子樹。

//實現 template <typename Type> void BinaryTree<Type>::inOrder(const TreeNode<Type> *subTree)const {if (subTree != NULL){inOrder(subTree->leftChild);visit(subTree);inOrder(subTree->rightChild);} }

后(根)序的遍歷算法:

1.若二叉樹為空樹,則空操作;

2.否則

? ? (1)后序遍歷左子樹;

? ? (2)后序遍歷右子樹;

? ? (3)訪問根結點。

//實現 template <typename Type> void BinaryTree<Type>::postOrder(const TreeNode<Type> *subTree)const {if (subTree != NULL){postOrder(subTree->leftChild);postOrder(subTree->rightChild);visit(subTree);} }

層次遍歷算法與visit操作:

template <typename Type> void BinaryTree<Type>::levelOrder() const {std::queue< TreeNode<Type>* > queue;queue.push(root);while (!queue.empty()){TreeNode<Type> *currentNode = queue.front();queue.pop();visit(currentNode);if (currentNode->leftChild != NULL)queue.push(currentNode->leftChild);if (currentNode->rightChild != NULL)queue.push(currentNode->rightChild);} }template <typename Type> void BinaryTree<Type>::visit(const TreeNode<Type> *currentNode) const {cout << currentNode->data << ' '; }

二叉樹構造與運用示例

構造一顆如下的二叉樹:

//代碼如下 int main() {BinaryTree<char> tree;TreeNode<char> addition('+'), subtraction('-'), multiplies('*'), divides('/');TreeNode<char> a('A'), b('B'), c('C'), d('D'), e('E');tree.root = &addition;addition.leftChild = &subtraction;addition.rightChild = &e;subtraction.leftChild = &multiplies;subtraction.rightChild = &d;multiplies.leftChild = ÷s;multiplies.rightChild = &c;divides.leftChild = &a;divides.rightChild = &b;cout << "preOrder: ";tree.preOrder();cout << endl;cout << "inOrder: " ;tree.inOrder();cout << endl;cout << "postOrder: ";tree.postOrder();cout << endl;cout << "level Order";tree.levelOrder();cout << endl;return 0; }

遍歷算法的應用舉例

? ? 1.統計二叉樹中葉子結點的個數(先序遍歷)

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

? ? 3.復制二叉樹(后序遍歷)

轉載于:https://www.cnblogs.com/itrena/p/5926990.html

總結

以上是生活随笔為你收集整理的数据结构基础(16) --树与二叉树的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。