按照陣列順序插入到二叉樹中

2022-09-22 04:54:08 字數 1228 閱讀 2537

參考文章

陣列與二叉樹的對應關係:乙個結點在陣列中的序號為 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的第乙個結點的左子...