二叉樹是重要的資料結構, 這裡用c++簡單實現,暫時不考慮其增加、刪除和修改。
二叉樹在底層其實就是用陣列儲存,可以用陣列實現二叉樹
首先建立乙個結構體,在其中儲存指標以及資料,這個結構體作為二叉樹的節點使用
template t>
struct binarytreenode //定義節點
};
然後就可以利用陣列建立二叉樹:
binarytree(t * a, size_t n, const t& invalid) //建立二叉樹,invalid為非法資料
node* createtree(t *a, size_t n, const t& invalid, size_t& index)
return root;
}
建立二叉樹之後就得實現它的遍歷,前序、中序和後序遍歷用遞迴可以實現(二叉樹較小可以使用,資料量太大時遞迴容易棧溢位)。
前序遍歷:
前序遍歷先訪問根節點,其次是左根,最後才是右根
如圖,從根節點開始,先訪問根節點,然後是其左子樹的根節點,繼續往左邊訪問左子樹的子樹,當遇到null時則已經是葉子節點,此時最小的左子樹已經訪問完畢,即圖中a區訪問完畢,接下來就是a區根節點的右子樹即b區,訪問完畢之後就該b區根節點的右子樹了,如此類推。
在訪問完a區之後,訪問b區和c區時的邏輯和訪問a區相同,可以用遞迴實現,**如下:
void prevorder()//前序遍歷
void _prevorder(node* root)
中序遍歷和後序遍歷:
中序遍歷和後序遍歷的邏輯和前序遍歷的邏輯相似,只是訪問的順序不同而已,**見下:
void inorder()//中序遍歷
void postorder()//後序遍歷
void _inorder(node* root)
void _postorder(node* root)
層序遍歷:
層序遍歷需要用到佇列實現,佇列只能從隊尾入隊、從對頭出隊,先將根節點入隊,然後在訪問,訪問之後就需要將其左根和右根分別入隊,之後將對頭的根節點刪除,左根變為對頭資料,取出訪問再將其左右根節點分別入隊,再刪除頭結點,拿出新的頭結點訪問……
整個過程邏輯相同,可以用乙個迴圈就能實現,如下:
void levlorder()//層序遍歷
void _levlorder(node* root)//層序遍歷依靠佇列實現
cout
<< endl;
}
除了遍歷,還要實現查詢函式、求深度、葉子結點的個數、每層的個數等等介面,完整**如下:
#pragma once
#include
#include
using namespace std;
template
t>
struct
binarytreenode //節點
};template
t>
class
binarytree //二叉樹
binarytree
(t * a, size_t
n, const
t& invalid)//建立二叉樹
binarytree
(const
binarytree
& t)//拷貝建構函式
//binarytree
& operator=(const
binarytree
& t)//賦值運算子的過載
//// return *this;
//}binarytree
& operator=(binarytree
& t)//賦值運算子的過載
void prevorder
()//前序遍歷
void inorder
()//中序遍歷
void postorder
()//後序遍歷
void levlorder
()//層序遍歷
node* find
(const
t& data)
size_t size
()//節點數
size_t leafsize
()//葉子結點數
size_t depth
()//深度
size_t getklevel
(size_t
k)//第k層的資料個數
~binarytree
()
protected:
node * createtree
(t *a, size_t
n, const
t& invalid, size_t& index)
return root;
}node* _copybinarytree(node* root)
node* newroot = new node
(root->_data);//拷貝根節點
newroot->_left = _copybinarytree(root->_left);
newroot->_right = _copybinarytree(root->_right);
return newroot;
}void destroy
(node * root)
void _prevorder(node* root)
void _inorder(node* root)
void _postorder(node* root)
void _levlorder(node* root)//層序遍歷依靠佇列實現
cout << endl;
}node* _find(node* root, const
t& x)
size_t _size(node* root)
size_t _leafsize(node* root)
return _leafsize(root->_left) + _leafsize(root->_right);
}size_t _depth(node* root)
size_t _getklevel(node* root, size_t
k)
protected:
node * _root;
};
二叉樹最簡單實現(c )
二叉樹的實現 這是我複習的第三部分,二叉樹的實現,這次需要的 比較少,所以把主函式貼出來了,注釋也很清晰,所以大家直接看 吧 樹 ifndef binnode h define binnode h template class elem class binnode endif 建樹操作 ifndef...
二叉樹 排序二叉樹的簡單實現
二叉樹 排序二叉樹 include using namespace std 二叉樹的節點 date 資料 left 指向二叉樹的左子樹 right 指向二叉樹的右子樹 template struct node template class btree public btree root null c...
C 實現二叉樹
其中的 linkstack.h 和 linkqueue 分別在 以下兩篇博文裡 linkstack linkqueue include include linkstack.h include linkqueue.h using namespace std 定義節點 templatestruct no...