二叉樹的實現與分析 原始碼及解析

2022-09-15 12:57:12 字數 3565 閱讀 8140

回顧一下,二叉樹的結點由乙個資料成員和兩個指向其子結點的指標組成。

結構體bitreenode代表二叉樹中的乙個單獨的結點,這個結構體由上述的3個成員組成

結構體bitree代表二叉樹這種資料結構。這個結構體包含4個成員:size表示樹中的結點的個數,compare成員在二叉樹中暫時不會用到,而是等到其他資料型別繼承二叉樹時才會派上用場。destroy作為引數傳遞給bitree_init函式。最後,root是乙個指向結點層次體系中最高點的指標,也就是指向根結點的指標。

示例1:二叉樹抽象資料型別的標頭檔案

/*

bitree.h

*/#ifndef bitree_h

#define bitree_h#include

/*定義二叉樹結點結構體

*/typedef

struct

bitreenode_

bitreenode;

/*定義二叉樹結構體

*/typedef

struct

bitree_

bitree;

/*公共介面部分

*/void bitree_init(bitree *tree,void (*destroy)(void *data));

void bitree_destroy(bitree *tree);

int bitree_ins_left(bitree *tree,bitreenode *node,const

void *data);

int bitree_ins_right(bitree *tree,bitreenode *node,const

void *data);

void bitree_rem_left(bitree *tree,bitreenode *node);

void bitree_rem_right(bitree *tree,bitreenode *node);

int bitree_merge(bitree *merge,bitree *left,bitree *right,const

void *data);

#define bitree_size(tree)((tree)->size)

#define bitree_root(tree)((tree)->root)

#define bitree_is_eob(node)((node) == null)

#define bitree_is_leaf(node)((node)->left == null && (node)->right == null)

#define bitree_data(node)((node)->data)

#define bitree_left(node)((node)->left)

#define bitree_right(node)((node)->right)

#endif

//bitree_h

示例2:二叉樹抽象資料型別的實現

#include #include 

#include

"bitree.h"/*

bitree_init 初始化二叉樹

*/void bitree_init(bitree *tree,void (*destroy)(void *data))

/*bitree_destroy 銷毀二叉樹

*/void bitree_destroy(bitree *tree)

/*bitree_ins_left 插入左子結點

*/int bitree_ins_left(bitree *tree,bitreenode *node,const

void *data)

else

/*為結點分配空間

*/if((new_node = (bitreenode*)malloc(sizeof(bitreenode)))==null)

return -1

;

new_node->data = (void*)data;

new_node->left =null;

new_node->right =null;

*position =new_node;

tree->size++;

return0;

}/*bitree_ins_right 插入右結點*/

int bitree_ins_right(bitree *tree,bitreenode *node,void *data)

else

/*為結點分配空間*/

if((new_node = (bitreenode*)malloc(sizeof(bitreenode)))==null)

return -1;

/*將結點插入樹中*/

new_node->data = (void*)data;

new_node->left = null;

new_node->right = null;

*position = new_node;

tree->size++;

return 0;

}/*bitree_rem_left 移除以指定結點的左子結點為根的子樹*/

void bitree_rem_left(bitree *tree,bitreenode *node)

free(*position);

*position = null;

tree->size--;

}return;

}

/*bitree_rem_left  移除以指定結點的右子結點為根的子樹*/

void betree_rem_right(bitree *tree,bitreenode *node)

free(*position);

*position = null;

tree->size--;

}return ;

}/*bitree_merge 將兩顆二叉樹合併為單顆二叉樹*/

int bitree_merge(bitree *merge, bitree *left, bitree *right, const void *data)

/*合併後的樹的左右子結點,分別設定為left和right的根結點*/

bitree_root(merge)->left = bitree_root(left);

bitree_root(merge)->right = bitree_root(right);

/*調集成並後的樹的結點的數量為本身的數量與左右兩顆樹的結點數量之和*/

merge->size = merge->size + bitree->size(left) + bitree_size(right);

/*解除原來樹中的結點關係,並分別將size設定為0*/

left->root = null;

left->size = 0;

right->root = null;

right->size = 0;

return 0;

}

二叉樹的C 原始碼

參考著課件,寫了乙個簡單的二叉樹,用法很簡單,方法也很少,要是誰有興趣的話,加上乙個線索二叉樹的方法,就更好了。kakabtree btree a,b,c,d e,f 用廣義表,表示法輸入 btree.preorder 前序遍歷 btree.inorder 中序遍歷 btree.postorder ...

二叉樹的結構分析及實現

二叉樹是每個節點最多只有兩個字數的樹結構,在圖的定義中二叉樹是乙個連通的無環圖,並且每個頂點的度不大於3 根節點的度不大於2 節點結構設計 class node public object getdata public void setdata object data public node get...

二叉樹及二叉樹的遍歷

二叉樹的定義 樹的度為2的樹。二叉樹的遞迴定義 二叉樹或者是一棵空樹,或者是一棵由乙個根結點和兩棵互不相交的左子樹和右子樹所組成的非空樹,而左右子樹又都是一棵二叉樹。1.第i層上至多有2的i 1次方個結點。2.深度為h的二叉樹至多有2的h次方減1個結點。3.每一層都滿的二叉樹稱為滿二叉樹,只在最後一...