【資料結構】二叉樹介面的實現(用c語言實現)
阿新 • • 發佈:2018-12-17
-
二叉樹
- 概念
一棵二叉樹是結點的一個有限集合,該集合或者為空,或者是由一個根節點加上兩棵別稱為左子樹和右子樹的二又樹組成。 二叉樹的特點: 1.每個結點最多有兩棵子樹,即二叉樹不存在度大於2的結點。2.二又樹的子樹有左右之分,其子樹的次序不能顛倒
-
特殊的二叉樹
1.滿二叉樹:一個二叉樹,如果每一個層的結點數都達到最大值,則這個二又樹就是滿二叉樹。也就是說,如果一個二叉樹的層數為K,且結點總數是(2^k)-1,則它就是滿二叉樹。 2.完全二叉樹:完全二又樹是效率很高的資料結構,完全- -又樹是由滿二又樹而引出來的。對於深度為K的,有n個結點的二叉樹,當且僅當其每一個結點都與深度為K的滿二又樹中編號從1至n的結點一對應時稱之為完全二又樹。要注意的是滿二叉樹是-種特殊的完全二叉樹。
具體實現程式碼如下:
-
BinaryTree.h
#pragma once #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <assert.h> #include "Queue.h" #include "Stack.h" typedef char BTDataType ; typedef struct BTNode { struct BTNode* _left; struct BTNode* _right; BTDataType _data; }BTNode; // 通過前序遍歷的陣列"ABD##E#H##CF##G##"構建二叉樹 BTNode* BinaryTreeCreate(BTDataType* a, int* pi); void BinaryTreeDestory(BTNode** root); int BinaryTreeSize(BTNode* root); int BinaryTreeLeafSize(BTNode* root); int BinaryTreeLevelKSize(BTNode* root, int k); BTNode* BinaryTreeFind(BTNode* root, BTDataType x); // 遍歷 遞迴 void BinaryTreePrevOrder(BTNode* root);//前序遍歷 void BinaryTreeInOrder(BTNode* root);//中序遍歷 void BinaryTreePostOrder(BTNode* root);//後序遍歷 void BinaryTreeLevelOrder(BTNode* root);//層序遍歷 // 遍歷 非遞迴 void BinaryTreePrevOrderNonR(BTNode* root);//前序遍歷的非遞迴 void BinaryTreeInOrderNonR(BTNode* root);//中序遍歷的非遞迴 void BinaryTreePostOrderNonR(BTNode* root);//後序遍歷的非遞迴 void TestBinaryTree();
-
BinaryTree.c
#include "BinaryTree.h" #include "Queue.h" #include "Stack.h" BTNode* BuyBTNode(BTDataType x) { BTNode* node = (BTNode*)malloc(sizeof(BTNode)); node->_data= x; node->_left =NULL; node->_right = NULL; return node; } BTNode* BinaryTreeCreate(BTDataType* a,int* pi) { if (a[*pi] != '#') { BTNode* root = BuyBTNode(a[*pi]); (*pi)++; root->_left = BinaryTreeCreate(a, pi); (*pi)++; root->_right = BinaryTreeCreate(a, pi); return root; } else { return NULL; } } int BinaryTreeSize(BTNode* root) { if (root == NULL) { return 0; } else { return BinaryTreeSize(root->_left) + BinaryTreeSize(root->_right) + 1; } } int BinaryTreeLeafSize(BTNode* root) { if (root == NULL) { return 0; } if (root->_left == NULL &&root->_right == NULL) { return 1; } return BinaryTreeLeafSize(root->_left) + BinaryTreeLeafSize(root->_right); } int BinaryTreeLevelKSize(BTNode* root, int k) { if (root == NULL) { return 0; } if (k == 1) { return 1; } return BinaryTreeLevelKSize(root->_left, k - 1) + BinaryTreeLevelKSize(root->_right, k - 1); } BTNode* BinaryTreeFind(BTNode* root, BTDataType x) { if (root == NULL) { return NULL; } if (root->_data == x) { return root; } BTNode* ret = BinaryTreeFind(root->_left, x); if (ret) { return ret; } return ret = BinaryTreeFind(root->_right, x); } void _BinaryTreePrevOrder(BTNode* root, int* a, int* pi) { if (root == NULL) { return ; } printf("%c ", root->_data); (*pi)++; _BinaryTreePrevOrder(root->_left, a, pi); _BinaryTreePrevOrder(root->_right, a, pi); } void BinaryTreePrevOrder(BTNode* root)//前序遍歷 { if (root == NULL) return ; int treeSize = BinaryTreeSize(root); int* arr = (int*)malloc(sizeof(int)*treeSize); int i = 0; _BinaryTreePrevOrder(root, arr, &i); } void _BinaryTreeInOrder(BTNode* root, int* arr, int* pi) { if (root == NULL) { return ; } _BinaryTreeInOrder(root->_left, arr, pi); printf("%c ", root->_data); _BinaryTreeInOrder(root->_right, arr, pi); } void BinaryTreeInOrder(BTNode* root)//中序遍歷 { if (root == NULL) return; int treeSize = BinaryTreeSize(root); int* arr = (int*)malloc(sizeof(int)*treeSize); int i = 0; _BinaryTreeInOrder(root, arr, &i); } void _BinaryTreePostOrder(BTNode* root, int* arr, int* pi) { if (root == NULL) return; _BinaryTreePostOrder(root->_left, arr, pi); _BinaryTreePostOrder(root->_right, arr, pi); printf("%c ", root->_data); } void BinaryTreePostOrder(BTNode* root)//後序遍歷 { if (root == NULL) { return; } int treeSize = BinaryTreeSize(root); int* arr = (int*)malloc(sizeof(int)*treeSize); int i = 0; _BinaryTreePostOrder(root, arr, &i); } void BinaryTreeLevelOrder(BTNode* root)//層序遍歷 { Queue q; QueueInit(&q); if (root != NULL) { QueuePush(&q, root); while (QueueEmpty(&q) != 0) { BTNode* front = QueueFront(&q); QueuePop(&q); printf("%c ", front->_data); if (front->_left) { QueuePush(&q, front->_left); } if (front->_right) { QueuePush(&q, front->_right); } } } printf("\n"); } void BinaryTreePrevOrderNonR(BTNode* root)//前序遍歷的非遞迴 { Stack st; StackInit(&st,10); BTNode* cur = root; while (cur || StackEmpty(&st) != 0) { //開始訪問一棵樹 //1.先訪問樹的左路節點 while (cur) { printf("%c ", cur->_data); StackPush(&st, cur); cur = cur->_left; } BTNode* top = StackTop(&st); StackPop(&st); //2.訪問左路節點的右子樹 cur = top->_right; } printf("\n"); } void BinaryTreeInOrderNonR(BTNode* root)//中序遍歷的非遞迴 { Stack st; StackInit(&st, 10); BTNode* cur = root; while (cur || StackEmpty(&st) != 0) { while (cur) { StackPush(&st, cur); cur = cur->_left; } BTNode* top = StackTop(&st); printf("%c ", top->_data); StackPop(&st); cur = top->_right; } printf("\n"); }
-
test.c
# include "BinaryTree.h"
#include "Queue.h"
#include "Stack.h"
void BinaryTreeTest()
{
char* array = "ABD##E#H##CF##G##";
int i = 0;
BTNode* tree = BinaryTreeCreate(array, &i);
printf("%d\n", BinaryTreeSize(tree));
printf("%d\n", BinaryTreeLeafSize(tree));
BinaryTreePrevOrder(tree); //遞迴的前序遍歷
printf("\n");
printf("\n");
BinaryTreeInOrder(tree);//遞迴的中序序遍歷
printf("\n");
printf("\n");
BinaryTreePostOrder(tree);//遞迴的後序遍歷
printf("\n");
printf("\n");
BinaryTreeLevelOrder(tree);//層序遍歷
printf("\n");
printf("\n");
BinaryTreePrevOrderNonR(tree);//非遞迴的前序遍歷
printf("\n");
BinaryTreeInOrderNonR(tree);//中序遍歷的非遞迴
}
int main()
{
BinaryTreeTest();
system("pause");
return 0;
}