在電腦科學中,二叉樹是每個節點最多有兩個子樹的樹結構。通常子樹被稱作「左子樹」(left subtree)和「右子樹」(right subtree)。二叉樹有幾個常用操作,這裡只寫了構造二叉樹,前序遍歷,中序遍歷,後序遍歷,層序遍歷,求樹的總結點,葉節點,樹的深度,樹中第k層的節點數和在樹中查詢乙個節點。主要用遞迴演算法實現。
前序遍歷:根,左,右;
中序遍歷:左,根,右;
後序遍歷:左,右,根;
#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)//賦值運算子的過載
//前序遍歷
void prevorder
()
//中序遍歷
void inorder
()
//後序遍歷
void postorder
()
//層序遍歷
void levelorder
()
//節點數
size_t _size()
//葉子節點數
size_t leafsize
()
//深度
size_t depth
()
//第k層的節點個數
size_t getklevel
(size_t
k)
node* find(const
t& x)
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 _levelorder(node* root)
cout << endl;
}//查詢
node* _find(node* root, const
t& x)
//節點數
size_t _size(node* root)
//葉子節點數
void _leafsize(node* root)
return _leafsize(root->_left) + _leafsize(root->_right);
}//深度
size_t _depth(node* root)
//第k層節點數
size_t _getklevel(node* root, size_t
k)
protected:
node* _root;
};int main()
; binarytree
t(a,13,0),tree;
tree = t;
cout()<()
<< endl;
cout << tree.leafsize
()<< endl;
tree.levelorder
(); tree.inorder
(); tree.postorder
(); tree.prevorder
(); cout << tree.getklevel
(2)<< endl;
cout << tree.find(5)
<< endl;
return 0;
}
遞迴實現二叉樹
二叉樹是一種非線性結構,用途廣泛。二叉樹的每個結點的度都不大於2,所以一般用二叉鍊錶來實現二叉樹。二叉樹可以分為根結點,左子樹和右子樹,左子樹 右子樹依然這麼劃分,所以用遞迴實現二叉樹的邏輯是比較簡單的,只需不斷對子樹進行劃分即可。include include include using name...
二叉樹的遞迴演算法
二叉樹是一種特殊的資料結構,有乙個根節點,根節點下面有一左一右兩個子節點,每個子節點又有各自的子節點,層層深入成樹狀。關於二叉樹的遍歷我只學習了遞迴遍歷,非遞迴遍歷比較複雜還是很理解。遞迴遍歷分為先序,中序和後序。用三個字母表示遞迴遍歷可以很好理解 d 訪問根節點,l 遍歷根節點的左子樹,r 遍歷根...
二叉樹 排序二叉樹的簡單實現
二叉樹 排序二叉樹 include using namespace std 二叉樹的節點 date 資料 left 指向二叉樹的左子樹 right 指向二叉樹的右子樹 template struct node template class btree public btree root null c...