1. 程式人生 > >【資料結構】二叉樹的順序儲存

【資料結構】二叉樹的順序儲存

原理

對於具有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; }

結果

這裡寫圖片描述