資料結構二叉樹

2021-08-05 18:33:07 字數 3928 閱讀 3219

在電腦科學中,二叉樹是每個節點最多有兩個子樹的樹結構。通常子樹被稱作「左子樹」(left subtree)和「右子樹」(right subtree)。二叉樹常被用於實現二叉查詢樹和二叉堆。

二叉樹的每個結點至多只有二棵子樹(不存在度大於2的結點),二叉樹的子樹有左右之分,次序不能顛倒。二叉樹的第i層至多有2^個結點;深度為k的二叉樹至多有2^k-1個結點;對任何一棵二叉樹t,如果其終端結點數為n_0,度為2的結點數為n_2,則n_0=n_2+1。

一棵深度為k,且有2^k-1個節點稱之為滿二叉樹;深度為k,有n個節點的二叉樹,當且僅當其每乙個節點都與深度為k的滿二叉樹中,序號為1至n的節點對應時,稱之為完全二叉樹。

以下為二叉樹的基本操作:

#ifndef __btree_h__

#define __btree_h__

#define bleft 0 // 表示插入二叉樹的左邊

#define bright 1 // 表示插入二叉樹的右邊

#define true 1

#define false 0

typedef char btreedata;

// 二叉樹的結點

typedef struct _btreenode

btreenode;

// 二叉樹

typedef struct _btree

btree;

typedef void (*print_btree)(btreenode*);

// 建立一棵二叉樹

btree *create_btree();

// pos 走的路徑 值類似 110(左右右) 011 (右右左)

// count 代表走的步數

// flag 代表被替換的結點應該插入在新節點的位置,如果是bleft 表示插在左邊,bright表示插在右邊

int btree_insert(btree *tree, btreedata data, int pos, int count, int flag);

void display (btree* tree, print_btree pfunc);

int delete (btree *tree, int pos, int count);

int btree_height (btree *);

int btree_degree (btree *);

int btree_clear (btree *);

int btree_destroy (btree **);

// 前序遍歷

void pre_order (btreenode *node);

void mid_order (btreenode *node);

void last_order (btreenode *node);

#endif // __btree_h__

#include "btree.h"

#include #include btree *create_btree()

int btree_insert(btree *tree, btreedata data, int pos, int count, int flag)

// 把被替換掉的結點插入到新節點下面

if (flag == bleft)

node->lchild = current;

else

node->rchild = current;

// 把新節點插入到二叉樹中,way儲存了應該插入在父節點的左邊還是右邊

if (parent != null)

else

tree->count ++;

return true;

}void r_display(btreenode* node, print_btree pfunc,int gap)

printf ("\n");

return; }

for (i = 0; i < gap; i++)

// 列印結點

// printf ("%c\n", node->data);

pfunc (node);

if (node->lchild != null || node->rchild != null) }

void display (btree* tree, print_btree pfunc)

void r_delete (btree *tree, btreenode* node)

int delete (btree *tree, int pos, int count)

if (parent != null)

else

// 釋放結點

r_delete (tree, current);

return true;

}int r_height (btreenode *node)

int btree_height (btree *tree)

int r_degree (btreenode * node)

return degree;

}int btree_degree (btree *tree)

int btree_clear (btree *tree)

int btree_destroy (btree **tree)

void pre_order (btreenode *node)

void mid_order (btreenode *node)

void last_order (btreenode *node)

#include "btree.h"

#include void printa(btreenode *node)

int main()

else

btree_insert(btree, 'a', 0, 0, 0);

btree_insert(btree, 'b', 0, 1, 0);

btree_insert(btree, 'c', 1, 1, 0);

btree_insert(btree, 'd', 0, 2, 0);

btree_insert(btree, 'e', 2, 2, 0);

btree_insert(btree, 'f', 0, 3, 0);

btree_insert(btree, 'g', 4, 3, 0);

btree_insert(btree, 'h', 3, 2, 0);

display(btree, printa);

printf ("前序遍歷:\n");

pre_order (btree->root);

printf ("\n");

printf ("中序遍歷:\n");

mid_order (btree->root);

printf ("\n");

printf ("後序遍歷:\n");

last_order (btree->root);

printf ("\n");

#if 0

delete(btree, 0, 1);

printf ("刪除後--------------\n");

display(btree, printa);

printf ("高度: %d\n", btree_height(btree));

printf ("度 : %d\n", btree_degree(btree));

printf ("清空後--------------\n");

btree_clear(btree);

display(btree, printa);

btree_destroy(&btree);

//btree = null;

#endif

return 0;

}

資料結構 二叉樹 反轉二叉樹

include using namespace std define maxsize 1000 struct binary tree node class queue queue queue void queue push binary tree node btn binary tree node ...

《資料結構》 二叉樹

二叉樹 是 n個結點的有限集,它或為空集,或由乙個根結點及兩棵互不相交的 分別稱為該根的左子樹和右子樹的二叉樹組成。二叉樹不是樹的特殊情況,這是兩種不同的資料結構 它與無序樹和度為 2的有序樹不同。二叉樹的性質 1 二叉樹第 i層上的結點數最多為 2 i 1 2 深度為 k的二叉樹至多有 2 k 1...

資料結構 二叉樹

1.二叉樹 二叉樹是一種特殊結構的樹,每個節點中最多有兩個子節點,如圖1所示 圖1 二叉樹 在圖1中的二叉樹裡,a c有兩個子節點,b d有乙個子節點。對於二叉樹還有圖2中的以下情況 圖2 二叉樹的特殊情況 在博文中還介紹了滿二叉樹和完全二叉樹還有其他的特殊二叉樹。2.二叉樹的實現 有兩種實現方式,...