基本概念梳理
- 孩子:子結點
- 雙親:父節點
- 度:有多少個子結點
- 有序樹:固定的排列的樹
- 無序樹:排列與順序無關的樹
- 二叉樹:所有結點小於等於2的樹
需要實現的方法
#pragma once #ifndef TREE_H #define TREE_H class Tree { public: Tree(int size,int *pRoot);//創建樹 ~Tree();//銷毀樹 int *SearchNode(int nodeIndex);//根據索引尋找結點 bool AddNode(int nodeIndex, int direction, int *pNode);//添加結點 bool DeleteNode(int nodeIndex, int *pNode);//刪除結點 void TreeTraverse();//遍歷 private: int *m_pTree; int m_iSize; }; #endif // !TREE_H
1.創建樹
傳入數組容量和根節點地址
m_iSize和m_pTree初始化
將數組都置為0初始化
pRoot指向的內存單元的樹值賦值數組首元素(根元素)
Tree::Tree(int size, int *pRoot) { m_iSize = size; m_pTree = new int[m_iSize]; for (int i = 0; i < m_iSize; i++) { m_pTree[i] = 0; } m_pTree[0] = *pRoot; }
2.銷毀樹
刪除指針並置空
Tree::~Tree() { delete []m_pTree; m_pTree = NULL; }
3.根據索引尋找結點
先判斷索引的合法性,索引不能小於0或者大於等於長度
傳入數組的值不能等於0
返回該數組地址
int *Tree::SearchNode(int nodeIndex) { if (nodeIndex<0 || nodeIndex>=m_iSize) { return NULL; } if (m_pTree[nodeIndex] == 0) { return NULL; } return &m_pTree[nodeIndex]; }
4.添加結點
判斷索引合法性,和3.一樣
direction = 0代表添加左子節點,direction = 1代表添加右子節點
左子節點 = 2*索引+1;右子節點 = 2*索引+2
下圖可以驗證
繼續判斷索引的合法性,左子節點和右子節點同樣不能小於0或者大於等於數組長度
最后將*pNode賦值給子節點
bool Tree::AddNode(int nodeIndex, int direction, int *pNode) { if (nodeIndex<0 || nodeIndex >= m_iSize) { return false; } if (m_pTree[nodeIndex] == 0) { return false; } if (direction == 0) { //nodeIndex * 2 + 1<0可以省略 if (nodeIndex * 2 + 1<0 || nodeIndex * 2 + 1 >= m_iSize) { return false; } //判斷是否有左子節點 if (m_pTree[nodeIndex * 2 + 1] != 0) { return false; } m_pTree[nodeIndex * 2 + 1] = *pNode; } if (direction == 1) { //nodeIndex * 2 + 2<0可以省略 if (nodeIndex * 2 + 2<0 || nodeIndex * 2 + 2 >= m_iSize) { return false; } //判斷是否有左子節點 if (m_pTree[nodeIndex * 2 + 2] != 0) { return false; } m_pTree[nodeIndex * 2 + 2] = *pNode; } return true; }
5.刪除結點
判斷索引和數組值的合法性
將*pNode接收刪除的對應索引的數組
將該索引數組置為0,結點值等於0代表刪除
返回正確結果
bool Tree::DeleteNode(int nodeIndex, int *pNode) { if (nodeIndex<0 || nodeIndex >= m_iSize) { return false; } if (m_pTree[nodeIndex] == 0) { return false; } *pNode = m_pTree[nodeIndex]; m_pTree[nodeIndex] = 0; return true; }
6.遍歷
沒啥好說的
void Tree::TreeTraverse() { for (int i = 0; i < m_iSize; i++) { cout << m_pTree[i] << " "; } }