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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

数据结构与算法(C++)– 树(Tree)

發布時間:2025/3/12 c/c++ 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构与算法(C++)– 树(Tree) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

數據結構與算法(C++)– 樹(Tree)


1、樹的基礎知識

  • 樹(tree): 一些節點的集合,可以為空集
  • 子樹(sub tree): 樹的子集
  • 根(root): 樹的第一個節點
  • 孩子和父親(Child and parent): 一條邊的前一個節點為父親,后一個節點為孩子
  • 葉 (leaf): 沒有孩子的節點
  • 兄弟(sibling): 具有相同父親的節點
  • 路徑和長度(Path and length): 任意兩個能聯通的節點間存在路徑,這條路徑上邊的個數即為長度
  • 深度和高(Depth and height): 從根到該節點的長度即為深度,從該節點到葉子節點的長度即為高度。一顆樹的深度總是等于高度。


2、二叉樹(Binary Tree )

定義: 每個節點都不能有多于兩個的孩子

樹的各種參數的關系:

  • N個節點的二叉樹的深度:最大(N-1), 最小(logN)
  • 二叉樹中深度為 i 的節點有幾個:最多(2^i), 最少(1)
  • 深度為 d 的二叉樹有幾個節點:最多(2^(d+1) - 1), 最少(d+1)
  • 二叉樹有 N0 個葉節點,N2 個兩個孩子的節點,求關系:
    • 節點數:N0 + N1 + N2 = N
    • 邊數:N1 + 2*N2 = N - 1
    • 推出:N2 = N0 - 1

各種樹:

  • 完美二叉樹(Perfect Binary Tree)
    • 除了葉子節點,其它節點都有兩個孩子
    • 所有葉子節點都在同一層
    • 每一層都達到其所能容納的最大節點數

  • 完全二叉樹(Complete Binary Tree )
    • 除了最后一層,其它每一層都達到其所能容納的最大節點數
    • 最后一層的所有節點都在左邊


3、樹的實現

// 孩子和兄弟 struct TreeNode {int data;TreeNode *fistChild;TreeNode *nextSibling; };// 左孩子和右孩子,只適用于二叉樹 struct BinaryTree {int data;BinaryTree *leftChild;BinaryTree *rightChild; };

4、樹的遍歷

創建樹:

輸入: 0 1 11 -1 -1 12 -1 123 -1 -1 2 -1 21 -1 -1

BinaryTree *CreatBiTree() {int data;BinaryTree *T;cin >> data;if(data == -1)T = NULL;else{T = new BinaryTree;T->data = data;T->leftChild = CreatBiTree();T->rightChild = CreatBiTree()}return T; }

前序遍歷(preorder traversal): 中左右

結果: R, T1, T11, T12, T123, T2, T21

void PreTravel(BinaryTree *tree) {if(tree){cout << tree->data << " ";PreTravel(tree->leftChild);PreTravel(tree->rightChild); } }

中序遍歷(Inorder Traversal): 左中右

結果: T11, T1, T12, T123, R, T2, T21

void InorderTravel(BinaryTree *tree) {if(tree){InorderTravel(tree->leftChild);cout << tree->data << " ";InorderTravel(tree->rightChild); } }

后序遍歷( Postorder Traversal ): 左右中

結果: T11, T123, T12, T1, T21, T2, R

void PostTravel(BinaryTree *tree) {if(tree){PostTravel(tree->leftChild);PostTravel(tree->rightChild); cout << tree->data << " "; } }

層序遍歷(Level-order Traversal):
結果: R, T1, T2, T11, T12, T21, T123


總結

以上是生活随笔為你收集整理的数据结构与算法(C++)– 树(Tree)的全部內容,希望文章能夠幫你解決所遇到的問題。

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