演算法精解(六) 二叉樹

2021-09-11 22:30:58 字數 2786 閱讀 8033

二叉樹是一種將結點按照層次結構組織起來的資料結構,每個結點最多只有兩個與它直接關聯的子節點。類似於細胞**一樣,1->2,2->4,4->8........

先序遍歷:1,訪問根節點,2.左節點,3.右節點-------------------------屬於深度優先遍歷

中序遍歷: 1.訪問左節點,2.根節點,3.右節點

後序遍歷: 1.訪問左節點,2.右節點,3.根節點

層級遍歷: 首先訪問樹的根,然後依次向下層處理,從左到右訪問每層的節點

具體如下圖圖示:

先序遍歷:20,9,5,1,7,15,11,53,44,79

中序遍歷:1,5,7,9,11,15,20,44,53,79

後序遍歷:1,7,5,11,15,9,44,53,79,20

層級遍歷:20,9,53,5,15,44,79,1,7,11

#include#includetypedef struct bitreenode_

bitreenode;

typedef struct bitree_

bitree;

#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) //獲取節點的右節點

//初始化二叉樹

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)

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;

}//指定節點位置插入右節點,與插入左節點邏輯基本一致

int bitree_ins_right(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++;

return 0;

}//從指定節點開始刪除左子樹

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

void bitree_rem_left(bitree *tree, bitreenode *node)

else

//如果節點不為空,開始遞迴到最底層節點

if (*position != null)

return;

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

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

//將另一條二叉樹的左右節點,複製給merge

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

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

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

left->root = null;

left->size = 0;

right->root = null;

right->size = 0;

return 0;

}

六 二叉樹和紅黑樹

或者是一棵空樹 或者是具有下列性質的二叉樹 它是一棵空樹 或它的左右兩個子樹的高度差 平衡因子 的絕對值不超過1 平衡二叉樹 每個結點的平衡因子都為1 1 0 的二叉排序樹。或者說每個結點的左右子樹的高度最多差1 的二叉排序樹。平衡二叉樹的目的是為了減少二叉查詢樹層次,提高查詢速度 r b tree...

資料結構筆記(六) 二叉樹

樹 n n 0 個結點的有限集。n 0時稱為空樹。在任意一棵非空樹中 有且僅有乙個特定的稱為根的結點 當n 1時,其餘結點可分為m m 0 個互不相交的有限集t1 t2 tm,其中每乙個集合本身又是一棵樹,並且稱為根的子樹。相關概念 度 結點擁有的子樹數。層次 從根開始,根為第一層,根的孩子為第二層...

演算法系列之六 二叉查詢樹

簡介 二叉查詢樹是一種資料結構,它支援多種動態集合操作。在二叉查詢樹上執行的基本操作的時間與樹的高度成正比。對於一棵含有n個節點的完全二叉樹,這些操作的最壞情況執行時間為o n 結構體 一棵二叉查詢樹按二叉樹結構來組織的。二叉查詢樹節點 struct treenode 性質 設x為二叉查詢樹上的乙個...