二叉樹的靜態實現

2021-09-26 03:47:07 字數 1577 閱讀 4299

二叉樹的靜態實現可以滿足完全不使用指標,而簡單使用陣列來完成二叉樹的所有操作。

在定義二叉樹時,採用的是二叉鍊錶的結構,如下所示:

struct node;
在這個定義中,為了能夠實時控制新生成的結點的個數,結構體node中的左右指標域都採用了指標。靜態的二叉鍊錶不需要使用指標即可實現。

結點的左右指標域均採用int型來代替,用來表示左右子樹的根節點在陣列中的下標。為此需要建立乙個大小為結點上限個數的node型陣列,所有動態生成的結點都直接使用陣列中的結點,所有對指標的操作均改為對陣列下標的訪問。於是,結點node的定義更改如下:

struct nodenode[maxn];//結點陣列,maxn為結點上限個數
在這樣的定義下,結點的動態生成就可以轉變為如下的靜態的指定:

int newnode(int v)
下面給出二叉樹的查詢、插入、建立的**,與使用指標的**有所區別。

//查詢,root為根節點在陣列中的下標

void search(int root,int x,int newdata)

if(node[root]==x)

search(node[root].lchild,x,newdata);//在左子樹中搜尋x(遞迴式)

search(node[root].rchild,x,newdata);

} //插入,root為根節點在陣列中的下標,記得加引用

void insert(int &root,int x)

if(由二叉樹的性質x應該插入左子樹)else

} //二叉樹的建立,函式返回根節點root的下標

int create(int data,int n)

//訪問根節點root,例如將其資料輸出

printf("%d\n",node[root].data);

//訪問左子樹

preorder(node[root].lchild);

//訪問右子樹

preorder(node[root].rchild);

} //中序遍歷

void inorder(int root)

//訪問左子樹

preorder(node[root].lchild);

//訪問根節點root,例如將其資料輸出

printf("%d\n",node[root].data);

//訪問右子樹

preorder(node[root].rchild);

} //後序遍歷

void postorder(int root)

//訪問左子樹

preorder(node[root].lchild);

//訪問右子樹

preorder(node[root].rchild);

//訪問根節點root,例如將其資料輸出

printf("%d\n",node[root].data);

} //層序遍歷

void layerorder(int root)

}

二叉樹實現了完全的靜態轉換

靜態二叉樹

不會用指標的也能實現二叉樹 靜態二叉樹 陣列實現。struct nodenode maxn int index 0 int newnode int v void search int root,int x,int newdata if node root data x search node roo...

二叉樹 排序二叉樹的簡單實現

二叉樹 排序二叉樹 include using namespace std 二叉樹的節點 date 資料 left 指向二叉樹的左子樹 right 指向二叉樹的右子樹 template struct node template class btree public btree root null c...

二叉樹實現

include include include include define maxsize 100 define ok 1 define error 0 define true 1 define false 0 typedef int status typedef int telemtype ty...