二叉樹是一種將結點按照層次結構組織起來的資料結構,每個結點最多只有兩個與它直接關聯的子節點。類似於細胞**一樣,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為二叉查詢樹上的乙個...