參考文章
陣列與二叉樹的對應關係:乙個結點在陣列中的序號為 i,則其左孩子結點序號為 2 * i,右孩子結點序號為 2 * i + 1;
根據這條關係,我們可以建立個按照陣列順序的二叉樹;
**說明: 按陣列 arr 順序建立二叉樹,i 為當前插入元素在陣列中的位置,n 為陣列元素個數,root 為本次插入的結點位址;這個函式的作用是將陣列中 arr[i] 元素插入到位址為 root 的位置上,那麼結點 root 的左孩子結點插入元素為 arr[2 * i],右孩子結點插入元素為 arr[2 * i + 1];每次建立乙個結點,建立的結點就是上乙個結點對應的左右結點;
node* insertleverorder(type arr, node* &root, int i, int n)
return root;
}
現在插入順序為 'a', 'b', 'c', 'd', 'e', 'f', 『g』 插入後的二叉樹如下:
完整**如下:
#includeusing namespace std;
typedef char type;
struct node ;
node* create(type x)
//通過 arr[i] 元素建立 root 結點,注意是 root 位址的引用
node* insertleverorder(type arr, node* &root, int i, int n)
return root;
}//中序遍歷
void inorder(node* root)
inorder(root->lchild);
printf("%c\n", root->data);
inorder(root->rchild);
}int main() ;
node* root = insertleverorder(data, root, 1, 8);
inorder(root);
return 0;
}
當然使用靜態儲存方式實現更加簡單,即使用陣列儲存二叉樹,若某結點在陣列中位置為 i,其左孩子結點和右孩子結點分別為 2 * i 和 2 * i + 1;就不需要使用指標了; 陣列順序儲存二叉樹
一般先判斷 陣列是否為空,然後再判斷長度是否為0,因為可能報空指標異常。不初始化的時候,預設是null。所以如果在一行 中要同時判斷的時候需要這樣寫 if array null array.length 0 注意 是度短路,如果為空,後面就不判斷了。package com public class ...
順序二叉樹
從資料儲存來看,陣列儲存方式和樹的儲存方式可以相互轉換,即陣列可 以轉換成樹,樹也可以轉換成陣列。順序二叉樹通常只考慮完全二叉樹 第n個元素的左子節點為 2 n 1 第n個元素的右子節點為 2 n 2 第n個元素的父節點為 n 1 2 n 表示二叉樹中的第幾個元素 按0開始編號如圖所示 相當於陣列的...
基於陣列完成順序二叉樹
給定乙個陣列a maxsize 若父結點為a k k 0 則其左子結點為a 2k 右子結點為a 2k 1 左子結點的左子結點為a 2 2 k 左子結點的右子結點為a 2 2 k 1 右子結點的左子結點為a 2 2 k 2 右子結點的右子結點為a 2 2 k 3 可以推導出,深度為n的第乙個結點的左子...