二叉樹とその基本操作
39166 ワード
スタックの基本的な操作については、「データ構造のスタックの基本的な操作」「キューに関する基本的な操作」を参照してください.
概念
一本の二叉の木は、結点の限定的な集合であり、集合または空であり、または一本のノードに二つの木を加えて、左の子樹と右の子樹と呼ばれる二叉の木からなる.
二叉樹の特徴:各結点には最大2つのサブツリーがあります.すなわち、二叉樹の存在度が2より大きい結点 は存在しません.二叉樹の子木には左右の区別があり、その子樹の順序は逆にしてはいけない.
満二叉木:一本の二叉樹において、すべての分岐点が左の子樹と右の子樹にあり、すべての葉ノードが同じ層において完全に二叉の木を有している場合:N個の結点を有する二叉樹の構造は、満二叉樹の前のN個の結点の構造と同じであり、完全二叉樹と呼ばれている.
性質 ルートノードの層数が1であると規定されている場合、1本の非空二叉樹のi番目の層には最大2^(i-1)(i>0)個の結点 がある.ルートノードのみの二叉樹の深さが1であると規定されると、Kの深さの二叉樹の最大の接合点数は2^k-1(k>=0) である.は、任意の二叉樹に対して、葉の結点個数がn 0である場合、度が2の非葉結点個数がn 2である場合、n 0=n 2+1 がある. n個の結点を有する完全な二叉樹の深さkは、log(n+1)上の整数 である.は、n個の結点を有する完全な二叉樹について、すべてのノードが上から下までの順に0から始まると、シーケンス番号iの結点について有する. 若i>0、両親番号:(i-1)/2;i=0,iはルートノード番号で、無双親ノード もし2 i+1<nなら、左の子供番号:2 i+1、さもなければ左の子供がいない もし2 i+2 保存
二叉樹は主に順序記憶とチェーン記憶構造の順記憶構造があります.完全な二叉樹のすべての結点については、順に一番下にあり、同じ層が左から右に順番に番号を付けると、一つのノードの順番配列の利点が得られます.完全な二叉樹を記憶し、簡単な省間欠点:一般的な二叉樹、特にシングルツリーを保存し、記憶空間の利用が高くないです.
基本操作二叉樹のエルゴード(先序、中序、後序、順) は、先に巡回した結果に基づいて、二叉樹を作成します. は、二叉樹を破壊する .クローン二叉樹 本の木の結点の個数を求めます. 本の木の葉の結点の個数を求めます. 本の木の第K層の結点の個数の を求めます.二叉樹の高さを求める は、結点が一本の二叉樹の中にあるかどうかを判断する .結点の左の子供の結点 を取得します.結点の右子供の結点 を取得します.結点の両親を獲得して を結びます.非再帰的に二叉樹を巡回した(先序、中序、後序) 二叉樹の鏡像を求めます. は、一本の二叉の木が完全な二叉の木であるかどうかを判断します.
①bin_tree.h
概念
一本の二叉の木は、結点の限定的な集合であり、集合または空であり、または一本のノードに二つの木を加えて、左の子樹と右の子樹と呼ばれる二叉の木からなる.
二叉樹の特徴:
満二叉木:一本の二叉樹において、すべての分岐点が左の子樹と右の子樹にあり、すべての葉ノードが同じ層において完全に二叉の木を有している場合:N個の結点を有する二叉樹の構造は、満二叉樹の前のN個の結点の構造と同じであり、完全二叉樹と呼ばれている.
性質
二叉樹は主に順序記憶とチェーン記憶構造の順記憶構造があります.完全な二叉樹のすべての結点については、順に一番下にあり、同じ層が左から右に順番に番号を付けると、一つのノードの順番配列の利点が得られます.完全な二叉樹を記憶し、簡単な省間欠点:一般的な二叉樹、特にシングルツリーを保存し、記憶空間の利用が高くないです.
基本操作
①bin_tree.h
#pragma once
#include
#include
#include
typedef char TreeNodeType;
typedef struct TreeNode{
TreeNodeType data;
struct TreeNode* lchild;
struct TreeNode* rchild;
}TreeNode;
void TreeInit(TreeNode** root);
void PreOrder(TreeNode* root); //
void InOrder(TreeNode* root); //
void PostOrder(TreeNode* root); //
void LevelOrder(TreeNode* root); //
TreeNode* TreeCreate(TreeNodeType array[], size_t size, TreeNodeType null_node); //
void TreeDestroy(TreeNode** root); //
TreeNode* TreeClone(TreeNode* root); //
size_t TreeSize(TreeNode* root); //
size_t TreeLeafSize(TreeNode* root); //
size_t TreeKLevelSize(TreeNode* root, int K); // K
size_t TreeHeight(TreeNode* root); //
TreeNode* TreeFind(TreeNode* root, TreeNodeType to_find); //
TreeNode* LChild(TreeNode* node); //
TreeNode* RChild(TreeNode* node); //
TreeNode* Parent(TreeNode* root, TreeNode* node); //
void PreOrderByLoop(TreeNode* root); //
void InOrderByLoop(TreeNode* root); //
void PostOrderByLoop(TreeNode* root); //
void TreeMirror(TreeNode* root); //
int isCompleteTree(TreeNode* root); //
②bin_tree.#include "bin_tree.h"
#include
#include "seqqueue.h"
#include "seqstack.h"
TreeNode* CreateTreeNode(TreeNodeType value){
TreeNode* new_node = (TreeNode*)malloc(sizeof(TreeNode));
new_node->data = value;
new_node->lchild = NULL;
new_node->rchild = NULL;
return new_node;
}
void DestroyTreeNode(TreeNode* ptr){
free(ptr);
}
void TreeInit(TreeNode** root){
if(root == NULL){
return;
}
*root = NULL;
}
void PreOrder(TreeNode* root){
if(root == NULL){
return;
}
printf("%c ",root->data);
PreOrder(root->lchild);
PreOrder(root->rchild);
}
void InOrder(TreeNode* root){
if(root == NULL){
return;
}
InOrder(root->lchild);
printf("%c ",root->data);
InOrder(root->rchild);
}
void PostOrder(TreeNode* root){
if(root == NULL){
return;
}
PostOrder(root->lchild);
PostOrder(root->rchild);
printf("%c ",root->data);
}
void LevelOrder(TreeNode* root){
if(root == NULL){
//
return;
}
SeqQueue q;
SeqQueueInit(&q);
//1.
SeqQueuePush(&q, root);
//2.
TreeNode* cur = NULL;
while(SeqQueueFront(&q, &cur)){
//3.
printf("%c ", cur->data);
SeqQueuePop(&q);
//4.
if(cur->lchild != NULL){
SeqQueuePush(&q, cur->lchild);
}
if(cur->rchild != NULL){
SeqQueuePush(&q, cur->rchild);
}
//5. ,
}
}
TreeNode* _TreeCreate(TreeNodeType array[], size_t size, size_t* index, TreeNodeType null_node){
if(index == NULL){
return NULL; //
}
if(*index >= size){
//
return NULL;
}
if(array[*index] == null_node){
return NULL;
}
TreeNode* new_node = CreateTreeNode(array[*index]);
++(*index);
new_node->lchild = _TreeCreate(array,size,index,null_node);
++(*index);
new_node->rchild = _TreeCreate(array,size,index,null_node);
return new_node;
}
TreeNode* TreeCreate(TreeNodeType array[], size_t size, TreeNodeType null_node){
//
size_t index = 0;
return _TreeCreate(array, size, &index, null_node);
}
void TreeDestroy(TreeNode** root){
if(root == NULL){
return; //
}
if(*root == NULL){
return;
}
TreeNode* to_delete = *root;
TreeNode* to_delete_lchild = to_delete->lchild;
TreeNode* to_delete_rchild = to_delete->rchild;
DestroyTreeNode(to_delete);
TreeDestroy(&to_delete_lchild);
TreeDestroy(&to_delete_rchild);
*root = NULL;
}
TreeNode* TreeClone(TreeNode* root){
if(root == NULL){
return NULL;
}
TreeNode* new_root = CreateTreeNode(root->data);
new_root->lchild = TreeClone(root->lchild);
new_root->rchild = TreeClone(root->rchild);
return new_root;
}
//size_t TreeSize(TreeNode* root){
// if(root == NULL){
// return 0;
// }
// return 1 + TreeSize(root->lchild) + TreeSize(root->rchild);
//}
//
void _TreeSize(TreeNode* root,size_t* size){
if(root == NULL || size == NULL){
return; //
}
// , size++
++(*size);
_TreeSize(root->lchild,size);
_TreeSize(root->rchild,size);
}
size_t TreeSize(TreeNode* root){
size_t size = 0;
_TreeSize(root,&size);
return size;
}
size_t TreeLeafSize(TreeNode* root){
if(root == NULL){
return 0;
}
if(root->lchild == NULL && root->rchild == NULL){
return 1;
}
return TreeLeafSize(root->lchild) + TreeLeafSize(root->rchild);
}
size_t TreeKLevelSize(TreeNode* root, int K){
if(root == NULL || K < 1){
return 0;
}
if(K == 1){
return 1;
}
return TreeKLevelSize(root->lchild, K - 1) + TreeKLevelSize(root->rchild, K - 1);
}
size_t TreeHeight(TreeNode* root){
if(root == NULL){
return 0;
}
size_t lheight = TreeHeight(root->lchild);
size_t rheight = TreeHeight(root->rchild);
return lheight > rheight ? lheight + 1 : rheight + 1;
}
TreeNode* TreeFind(TreeNode* root, TreeNodeType to_find){
if(root == NULL){
return NULL;
}
if(root->data == to_find){
return root;
}
TreeNode* lresult = TreeFind(root->lchild, to_find);
TreeNode* rresult = TreeFind(root->rchild, to_find);
return lresult != NULL ? lresult : rresult;
}
TreeNode* LChild(TreeNode* node){
if(node == NULL){
return NULL;
}
return node->lchild;
}
TreeNode* RChild(TreeNode* node){
if(node == NULL){
return NULL;
}
return node->rchild;
}
TreeNode* Parent(TreeNode* root, TreeNode* node){
if(root == NULL || node == NULL){
return NULL;
}
if(root->lchild == node || root->rchild == node){
return root;
}
TreeNode* lresult = Parent(root->lchild, node);
TreeNode* rresult = Parent(root->rchild, node);
return lresult != NULL ? lresult : rresult;
}
void PreOrderByLoop(TreeNode* root){
if(root == NULL){
return;
}
SeqStack stack;
SeqStackInit(&stack);
SeqStackPush(&stack, root);
while(1){
TreeNode* top = NULL;
SeqStackTop(&stack, &top);
if(top == NULL){
//
break;
}
//
printf("%c ", top->data);
//
SeqStackPop(&stack);
//
if(top->rchild != NULL){
SeqStackPush(&stack, top->rchild);
}
if(top->lchild != NULL){
SeqStackPush(&stack, top->lchild);
}
}
printf("
");
}
void InOrderByLoop(TreeNode* root){
if(root == NULL){
return;
}
SeqStack stack;
SeqStackInit(&stack);
TreeNode* cur = root;
while(1){
//1. ,
// ,
while(cur != NULL){
SeqStackPush(&stack, cur);
cur = cur->lchild;
}
//2. , ,
TreeNode* top = NULL;
SeqStackTop(&stack, &top);
if(top == NULL){
//
break;
}
printf("%c ", top->data);
SeqStackPop(&stack);
//3. , ,
cur = top->rchild;
}
printf("
");
return;
}
void PostOrderByLoop(TreeNode* root){
if(root == NULL){
return;
}
SeqStack stack;
SeqStackInit(&stack);
TreeNode* cur = root;
TreeNode* pre = NULL;
while(1){
while(cur != NULL){
SeqStackPush(&stack, cur);
cur = cur->lchild;
}
TreeNode* top = NULL;
SeqStackTop(&stack, &top);
if(top == NULL){
break;
}
// , , top
//1.top
//2.top
// top
if(top->rchild == NULL || top->rchild == pre){
printf("%c ", top->data);
SeqStackPop(&stack);
pre = top;
}
else{
cur = top->rchild;
}
}
printf("
");
}
void TreeMirror(TreeNode* root){
if(root == NULL){
return;
}
TreeNode* tmp = root->lchild;
root->lchild = root->rchild;
root->rchild = tmp;
TreeMirror(root->lchild);
TreeMirror(root->rchild);
}
int isCompleteTree(TreeNode* root){
if(root == NULL){
return -1;
}
SeqQueue queue;
SeqQueueInit(&queue);
SeqQueuePush(&queue, root);
int flag = 0; //
while(1){
TreeNode* top = NULL;
SeqQueueFront(&queue, &top);
if(top == NULL){
//
break;
}
//
if(flag == 0){
if(top->lchild != NULL && top->rchild != NULL){
SeqQueuePush(&queue, top->lchild);
SeqQueuePush(&queue, top->rchild);
}
else if(top->lchild == NULL && top->rchild != NULL){
return 0;
}
else if(top->lchild != NULL && top->rchild == NULL){
SeqQueuePush(&queue, top->lchild);
flag = 1;
}
else if(top->lchild == NULL && top->rchild == NULL){
flag = 1;
}
}
else{
if(top->lchild == NULL && top->rchild == NULL){
//
}
else{
return 0;
}
}
SeqQueuePop(&queue);
}
return 1;
}
③test.#include "bin_tree.h"
#include
#include
#include
#define TEST_HEADER printf("
========================%s====================
",__FUNCTION__)
void TestInit(){
TEST_HEADER;
TreeNode* root;
TreeInit(&root);
printf("root expect NULL, actual %p
",root);
}
void TestPreOrder(){
TEST_HEADER;
TreeNode* root;
TreeInit(&root);
TreeNode* a = CreateTreeNode('a');
TreeNode* b = CreateTreeNode('b');
TreeNode* c = CreateTreeNode('c');
TreeNode* d = CreateTreeNode('d');
TreeNode* e = CreateTreeNode('e');
TreeNode* f = CreateTreeNode('f');
TreeNode* g = CreateTreeNode('g');
a->lchild = b;
a->rchild = c;
b->lchild = d;
b->rchild = e;
e->lchild = g;
c->rchild = f;
root = a;
printf("[ ]:");
PreOrder(root);
printf("
");
}
void TestInOrder(){
TEST_HEADER;
TreeNode* root;
TreeInit(&root);
TreeNode* a = CreateTreeNode('a');
TreeNode* b = CreateTreeNode('b');
TreeNode* c = CreateTreeNode('c');
TreeNode* d = CreateTreeNode('d');
TreeNode* e = CreateTreeNode('e');
TreeNode* f = CreateTreeNode('f');
TreeNode* g = CreateTreeNode('g');
a->lchild = b;
a->rchild = c;
b->lchild = d;
b->rchild = e;
e->lchild = g;
c->rchild = f;
root = a;
printf("[ ]:");
InOrder(root);
printf("
");
}
void TestPostOrder(){
TEST_HEADER;
TreeNode* root;
TreeInit(&root);
TreeNode* a = CreateTreeNode('a');
TreeNode* b = CreateTreeNode('b');
TreeNode* c = CreateTreeNode('c');
TreeNode* d = CreateTreeNode('d');
TreeNode* e = CreateTreeNode('e');
TreeNode* f = CreateTreeNode('f');
TreeNode* g = CreateTreeNode('g');
a->lchild = b;
a->rchild = c;
b->lchild = d;
b->rchild = e;
e->lchild = g;
c->rchild = f;
root = a;
printf("[ ]:");
PostOrder(root);
printf("
");
}
void TestLevelOrder(){
TEST_HEADER;
TreeNode* root;
TreeInit(&root);
TreeNode* a = CreateTreeNode('a');
TreeNode* b = CreateTreeNode('b');
TreeNode* c = CreateTreeNode('c');
TreeNode* d = CreateTreeNode('d');
TreeNode* e = CreateTreeNode('e');
TreeNode* f = CreateTreeNode('f');
TreeNode* g = CreateTreeNode('g');
a->lchild = b;
a->rchild = c;
b->lchild = d;
b->rchild = e;
e->lchild = g;
c->rchild = f;
root = a;
printf("[ ]:");
LevelOrder(root);
printf("
");
}
void TestCreate(){
TEST_HEADER;
TreeNodeType array[] = "abd##eg###c#f##";
TreeNode* root = TreeCreate(array,strlen(array),'#');
printf("[ ]:");
PreOrder(root);
printf("
");
printf("[ ]:");
InOrder(root);
printf("
");
printf("[ ]:");
PostOrder(root);
printf("
");
}
void TestDestroy(){
TEST_HEADER;
TreeNodeType array[] = "abd##eg###c#f##";
TreeNode* root = TreeCreate(array,strlen(array),'#');
TreeDestroy(&root);
printf("root expect NULL, actual %p
", root);
}
void TestClone(){
TEST_HEADER;
TreeNodeType array[] = "abd##eg###c#f##";
TreeNode* root = TreeCreate(array,strlen(array),'#');
TreeNode* new_root = TreeClone(root);
printf("new_root: %p, root: %p
",new_root,root);
printf("[ ]:");
PreOrder(new_root);
printf("
");
printf("[ ]:");
InOrder(new_root);
printf("
");
printf("[ ]:");
PostOrder(new_root);
printf("
");
}
void TestSize(){
TEST_HEADER;
TreeNodeType array[] = "abd##eg###c#f##";
TreeNode* root = TreeCreate(array,strlen(array),'#');
printf("size expect 7, actual %lu
",TreeSize(root));
}
void TestLeafSize(){
TEST_HEADER;
TreeNodeType array[] = "abd##eg###c#f##";
TreeNode* root = TreeCreate(array, strlen(array), '#');
printf("leafsize expect 3, actual %lu
", TreeLeafSize(root));
}
void TestKLevelSize(){
TEST_HEADER;
TreeNodeType array[] = "abd##eg###c#f##";
TreeNode* root = TreeCreate(array, strlen(array), '#');
printf("3LevelSize expect 3, actual %lu
", TreeKLevelSize(root, 3));
}
void TestHeight(){
TEST_HEADER;
TreeNodeType array[] = "abd##eg###c#f##";
TreeNode* root = TreeCreate(array, strlen(array), '#');
printf("height expect 4, actual %lu
", TreeHeight(root));
}
void TestFind(){
TEST_HEADER;
TreeNodeType array[] = "abd##eg###c#f##";
TreeNode* root = TreeCreate(array, strlen(array), '#');
TreeNode* find = TreeFind(root, 'd');
printf("find->data expect d, actual %c
", find->data);
}
void TestLChild(){
TEST_HEADER;
TreeNodeType array[] = "abd##eg###c#f##";
TreeNode* root = TreeCreate(array, strlen(array), '#');
TreeNode* find = TreeFind(root, 'b');
TreeNode* lchild = LChild(find);
printf("lchild->data expect d, actual %c
", lchild->data);
}
void TestRChild(){
TEST_HEADER;
TreeNodeType array[] = "abd##eg###c#f##";
TreeNode* root = TreeCreate(array, strlen(array), '#');
TreeNode* find = TreeFind(root, 'b');
TreeNode* rchild = RChild(find);
printf("rchild->data expect e, actual %c
", rchild->data);
}
void TestParent(){
TEST_HEADER;
TreeNodeType array[] = "abd##eg###c#f##";
TreeNode* root = TreeCreate(array, strlen(array), '#');
TreeNode* find = TreeFind(root, 'b');
TreeNode* parent = Parent(root, find);
printf("b parent expect a, actual %c
", parent->data);
find = TreeFind(root, 'f');
parent = Parent(root, find);
printf("f parent expect c, actual %c
", parent->data);
}
void TestPreOrderByLoop(){
TEST_HEADER;
TreeNodeType array[] = "abd##eg###c#f##";
TreeNode* root = TreeCreate(array, strlen(array), '#');
printf("[ ]:");
PreOrderByLoop(root);
}
void TestInOrderByLoop(){
TEST_HEADER;
TreeNodeType array[] = "abd##eg###c#f##";
TreeNode* root = TreeCreate(array, strlen(array), '#');
printf("[ ]:");
InOrderByLoop(root);
}
void TestPostOrderByLoop(){
TEST_HEADER;
TreeNodeType array[] = "abd##eg###c#f##";
TreeNode* root = TreeCreate(array, strlen(array), '#');
printf("[ ]:");
PostOrderByLoop(root);
}
void TestMirror(){
TEST_HEADER;
TreeNodeType array[] = "abd##eg###c#f##";
TreeNode* root = TreeCreate(array, strlen(array), '#');
TreeMirror(root);
printf("[ ]:");
PreOrderByLoop(root);
printf("[ ]:");
InOrderByLoop(root);
printf("[ ]:");
PostOrderByLoop(root);
}
void TestIsCompleteTree(){
TEST_HEADER;
TreeNodeType array[] = "abd##eg###c#f##";
TreeNode* root = TreeCreate(array, strlen(array), '#');
int ret = isCompleteTree(root);
printf("ret expect 0, actual %d
", ret);
TreeNodeType array1[] = "abd##e##cf###";
TreeNode* root1 = TreeCreate(array1, strlen(array1), '#');
ret = isCompleteTree(root1);
printf("ret expect 1, actual %d
", ret);
}
int main(){
TestInit();
TestPreOrder();
TestInOrder();
TestPostOrder();
TestLevelOrder();
TestCreate();
TestDestroy();
TestClone();
TestSize();
TestLeafSize();
TestKLevelSize();
TestHeight();
TestFind();
TestLChild();
TestRChild();
TestParent();
TestPreOrderByLoop();
TestInOrderByLoop();
TestPostOrderByLoop();
TestMirror();
TestIsCompleteTree();
return 0;
}