【資料結構】二叉樹的順序儲存
阿新 • • 發佈:2019-02-06
原理
對於具有n個節點的完全二叉樹,如果按照從上至下和從左至右的順序對所有節點序號從0開始順序編號,則對於序號為 i(0<=i < n)的節點有:
1)如果i〉0,則序號為i節點的雙親節點的序號為(i-1)/2(/為整除);如果i=0,則序號為i節點為根節點,無雙親節點。
2)如果2i+1 < n,則序號為i節點的左孩子節點的序號為2i+1;如果2i+1>=n,則序號為i節點無左孩子。
3)如果2i+2 < n,則序號為i節點的右孩子節點的序號為2i+2;如果2i+2>=n,則序號為i節點無右孩子。
請看程式碼
#include<Windows.h>
#include<iostream>
using namespace std;
#define max 15
typedef char data;
typedef struct binarytree//二叉樹結構
{
data _arr[max];
int sz;
}bintree;
void initbinarytree(binarytree& s)//初始化二叉樹
{
for (int i = 0; i < max; i++) {
s._arr[i] = '0';
s.sz = 0;
}
}
int insertroot(binarytree&s, data e)//插入根結點
{
s._arr[0] = e;
s.sz++;
return 1;
}
int insert_left(binarytree& s, int i, data e)//插入右孩子
{
if (2 * i + 1>max || i<0)
{
return -1;
}
if (s._arr[2 * i + 1] == '0'){
s._arr[(2 * i + 1)] = e;
s.sz++;
return 1;
}
return -1;
}
int insert_right(binarytree &s, int i, data e)//插入左孩子
{
if (2 * i + 2>max || i<0) {
return -1;
}
if (s._arr[2 * i + 2] == '0'){
s._arr[2 * i + 2] = e;
s.sz++;
return 1;
}
return -1;
}
void printftree(binarytree &s)//列印二叉樹(比較low)
{
if (s.sz == 0) {
cout << "空樹";
}
for (int i = 0; i<s.sz; i++)
{
cout << s._arr[i];
if (i==2||i==6||i==0)
{
cout << "" << endl;
}
}
cout << endl;
}
void creat_binarytree(binarytree &s)
{
data n = 0;
cout << "請從上到下從左往右輸入結點的值,空結點用0代替,你最多可以輸入" << max << "個結點" << endl;
while (cin >> n)
{
s._arr[s.sz] = n;
s.sz++;
if (s.sz == 15)
{
return;
}
}
}
void preorder(binarytree s, int i)//遞迴前序遍歷
{
if (i < max)
{
cout << s._arr[i] << " ";
if (s._arr[2 * i + 1] != '0')
preorder(s, 2 * i + 1);
if (s._arr[2 * i + 2] != '0')
preorder(s, 2 * i + 2);
}
}
void inorder(binarytree s, int i)//中序遞迴
{
if (i < max)
{
if (s._arr[2 * i + 1] != '0')
preorder(s, 2 * i + 1);
cout << s._arr[i] << " ";
if (s._arr[2 * i + 2] != '0')
preorder(s, 2 * i + 2);
}
}
void postorder(binarytree s, int i)//後續遞迴
{
if (i < max)
{
if (s._arr[2 * i + 2] != '0')
preorder(s, 2 * i + 2);
cout << s._arr[i] << " ";
if (s._arr[2 * i + 1] != '0')
preorder(s, 2 * i + 1);
}
}
int main() {
binarytree s;
initbinarytree(s);
creat_binarytree(s);
cout<<"樹結構"<<endl;
printftree(s);
cout << "前序遍歷:";
preorder(s, 0);
cout <<endl;
cout << "中序遍歷:";
inorder(s, 0);
cout << endl;
cout << "後序遍歷:";
postorder(s, 0);
cout << endl;
system("pause");
return 0;
}