数据结构与算法(C++)– 树(Tree)
生活随笔
收集整理的這篇文章主要介紹了
数据结构与算法(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)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 只考计算机知识吗,计算机二级只考一门吗?
- 下一篇: 计算机专业课程设计报告c语言,计算机程序