日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据结构-树2-二叉树各种函数实现

發布時間:2025/3/15 编程问答 12 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构-树2-二叉树各种函数实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、二叉樹的遞歸遍歷

二叉樹的遞歸遍歷.c

#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h>//二叉樹的結點 typedef struct BINARYNODE {char ch;struct BINARYNODE *lchild;struct BINARYNODE *rchild; }BinaryNode;void Recursion(BinaryNode* root) {if (root == NULL) //退出條件return;//先序遍歷printf("%c", root->ch); //訪問根結點Recursion(root->lchild); //左子樹遍歷Recursion(root->rchild); //右子樹遍歷//中序遍歷/*Recursion(root->lchild);printf("%c ", root->ch);Recursion(root->rchild);*///后序遍歷/*Recursion(root->lchild);Recursion(root->rchild);printf("%c ", root->ch);*/ }void CreateBinaryTree() {/*A/ \B F\ \C G/ \ /D E H*///創建結點BinaryNode node1 = { 'A',NULL,NULL }; //字符需用'' 字符串用""BinaryNode node2 = { 'B',NULL,NULL };BinaryNode node3 = { 'C',NULL,NULL };BinaryNode node4 = { 'D',NULL,NULL };BinaryNode node5 = { 'E',NULL,NULL };BinaryNode node6 = { 'F',NULL,NULL };BinaryNode node7 = { 'G',NULL,NULL };BinaryNode node8 = { 'H',NULL,NULL };node1.lchild = &node2;node1.rchild = &node6;node2.lchild = &node3;node3.lchild = &node4;node3.rchild = &node5;node6.rchild = &node7;node7.lchild = &node8;//遞歸遍歷Recursion(&node1); }int main() {CreateBinaryTree();return 0; }

運行結果:

二、求二叉樹的葉子結點數

求二叉樹的葉子結點數.cpp

#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h>//二叉樹的結點 typedef struct BINARYNODE {char ch;struct BINARYNODE *lchild;struct BINARYNODE *rchild; }BinaryNode; int num = 0; void CaculateLeafNum(BinaryNode* root) {if (root == NULL) //退出條件return;if (root->lchild == NULL && root->rchild == NULL){num++;}CaculateLeafNum(root->lchild); //左子樹遍歷CaculateLeafNum(root->rchild); //右子樹遍歷 }void CaculateLeafNum(BinaryNode* root,int *pNum) {if (root == NULL) //退出條件return;if (root->lchild == NULL && root->rchild == NULL){(*pNum)++;}CaculateLeafNum(root->lchild,pNum); //左子樹遍歷CaculateLeafNum(root->rchild,pNum); //右子樹遍歷 }void CreateBinaryTree() {/*A/ \B F\ \C G/ \ /D E H*///創建結點BinaryNode node1 = { 'A',NULL,NULL }; //字符需用'' 字符串用""BinaryNode node2 = { 'B',NULL,NULL };BinaryNode node3 = { 'C',NULL,NULL };BinaryNode node4 = { 'D',NULL,NULL };BinaryNode node5 = { 'E',NULL,NULL };BinaryNode node6 = { 'F',NULL,NULL };BinaryNode node7 = { 'G',NULL,NULL };BinaryNode node8 = { 'H',NULL,NULL };node1.lchild = &node2;node1.rchild = &node6;node2.lchild = &node3;node3.lchild = &node4;node3.rchild = &node5;node6.rchild = &node7;node7.lchild = &node8;//葉子結點個數/*CaculateLeafNum(&node1);printf("葉子結點數:%d",num);*/int leafNum = 0;CaculateLeafNum(&node1, &leafNum);printf("葉子結點數:%d", leafNum);}int main() {CreateBinaryTree();return 0; }

?

運行結果:

?

三、求樹的高度

求樹的高度.cpp

#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h>//二叉樹的結點 typedef struct BINARYNODE {char ch;struct BINARYNODE *lchild;struct BINARYNODE *rchild; }BinaryNode;int getTreeHeight(BinaryNode* root) {if (root == NULL) //退出條件return 0;//求出左子樹的高度int lheight = getTreeHeight(root->rchild);//求出右子樹的高度int rheight = getTreeHeight(root->lchild);//取左子樹和右子樹中最大值+1int height = lheight > rheight ? lheight + 1 : rheight + 1;return height; }void CreateBinaryTree() {/*A/ \B F\ \C G/ \ /D E H*///創建結點BinaryNode node1 = { 'A',NULL,NULL }; //字符需用'' 字符串用""BinaryNode node2 = { 'B',NULL,NULL };BinaryNode node3 = { 'C',NULL,NULL };BinaryNode node4 = { 'D',NULL,NULL };BinaryNode node5 = { 'E',NULL,NULL };BinaryNode node6 = { 'F',NULL,NULL };BinaryNode node7 = { 'G',NULL,NULL };BinaryNode node8 = { 'H',NULL,NULL };node1.lchild = &node2;node1.rchild = &node6;node2.lchild = &node3;node3.lchild = &node4;node3.rchild = &node5;node6.rchild = &node7;node7.lchild = &node8;//求樹的高度int height = getTreeHeight(&node1);printf("樹的高度:%d\n", height);}int main() {CreateBinaryTree(); return 0; }

運行結果:

四、二叉樹的拷貝和釋放

二叉樹的拷貝和釋放.cpp

#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h>//二叉樹的結點 typedef struct BINARYNODE {char ch;struct BINARYNODE *lchild;struct BINARYNODE *rchild; }BinaryNode;//遍歷二叉樹 void Recursion(BinaryNode* root) {if (root == NULL) //退出條件return;//先序遍歷printf("%c", root->ch); //訪問根結點Recursion(root->lchild); //左子樹遍歷Recursion(root->rchild); //右子樹遍歷 }//拷貝二叉樹 BinaryNode* CopyBinaryTree(BinaryNode* root) {if (root == NULL)return NULL;//拷貝左子樹BinaryNode* lchild=CopyBinaryTree(root->lchild);//拷貝右子樹BinaryNode* rchild=CopyBinaryTree(root->rchild);//創建結點BinaryNode* newnode =(BinaryNode*) malloc(sizeof(BinaryNode));newnode->ch = root->ch;newnode->lchild = lchild;newnode->rchild = rchild;return newnode;}//釋放二叉樹內存 void FreeSpaceBinaryTree(BinaryNode* root) {if (root == NULL)return;//釋放左子樹FreeSpaceBinaryTree(root->lchild);//釋放右子樹FreeSpaceBinaryTree(root->rchild);//釋放當前結點FreeSpaceBinaryTree(root); } void CreateBinaryTree() {/*A/ \B F\ \C G/ \ /D E H*///創建結點BinaryNode node1 = { 'A',NULL,NULL }; //字符需用'' 字符串用""BinaryNode node2 = { 'B',NULL,NULL };BinaryNode node3 = { 'C',NULL,NULL };BinaryNode node4 = { 'D',NULL,NULL };BinaryNode node5 = { 'E',NULL,NULL };BinaryNode node6 = { 'F',NULL,NULL };BinaryNode node7 = { 'G',NULL,NULL };BinaryNode node8 = { 'H',NULL,NULL };node1.lchild = &node2;node1.rchild = &node6;node2.lchild = &node3;node3.lchild = &node4;node3.rchild = &node5;node6.rchild = &node7;node7.lchild = &node8;BinaryNode *root = CopyBinaryTree(&node1);Recursion(root);FreeSpaceBinaryTree(root);}int main() {CreateBinaryTree();return 0; }

運行結果:

五、二叉樹的非遞歸遍歷

LinkList.h

#include<stdlib.h> #include<stdio.h> #include<string.h> #define MAX_SIZE 1024 #define TRUE 1 #define FALSE 0//鏈表結點--存儲下一個結點指針 typedef struct LINKNODE {struct LINKNODE *next; }LinkNode;//鏈表--保存頭結點,和鏈表長度 typedef struct LINKLIST {struct LINKNODE head;int size; }LinkList;//初始化 LinkList* Init_linkList();//壓入元素 void Push_LinkList(LinkList* stack, LinkNode* data);//取出棧頂元素 LinkNode* Top_LinkList(LinkList* stack);//彈出棧頂元素 void Pop_LinkList(LinkList* stack);//判斷是否為空 int IsEmpty_LinkList(LinkList* stack);//返回棧元素個數 int Size_LinkList(LinkList* stack);//清空棧元素 void Clear_LinkList(LinkList* stack);//銷毀棧元素 void FreeSpace_LinkList(LinkList* stack);

LinkList.c

#include"LinkList.h" //初始化 LinkList* Init_linkList() {LinkList* stack = (LinkList*)malloc(sizeof(LinkList));stack->head.next = NULL;stack->size = 0;return stack; }//壓入元素 void Push_LinkList(LinkList* stack, LinkNode* data) {if (stack == NULL){return;}if (data == NULL){return;}data->next = stack->head.next;//stack->head.next = data->next; //問題2:沒有繞對。。stack->head.next = data;stack->size++; }//返回棧頂元素 LinkNode* Top_LinkList(LinkList* stack) {if (stack == NULL){return NULL;}if (stack->size == 0) {return NULL;}return stack->head.next; }//彈出棧頂元素 void Pop_LinkList(LinkList* stack) {if (stack == NULL){return;}if (stack->size == 0) {return;}//第一個有效結點LinkNode *pNext = stack->head.next;//pNext->next = stack->head.next; 我的錯誤做法stack->head.next = pNext->next;stack->size--;}//判斷是否為空 int IsEmpty_LinkList(LinkList* stack) {if (stack == NULL){return -1;}if (stack->size == 0)return TRUE;return FALSE; }//返回棧元素個數 int Size_LinkList(LinkList* stack) {if (stack == NULL){return -1;}return stack->size; }//清空棧元素 void Clear_LinkList(LinkList* stack) {if (stack == NULL){return;}stack->head.next = NULL;stack->size = 0; }//銷毀棧元素 void FreeSpace_LinkList(LinkList* stack) {if (stack == NULL){return;}free(stack); }

二叉樹的非遞歸遍歷.c

#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h> #include"LinkList.h" #define MY_FALSAE 0 #define MY_TRUE 1 //二叉樹的結點 typedef struct BINARYNODE {char ch;struct BINARYNODE *lchild;struct BINARYNODE *rchild; }BinaryNode;//二叉樹的非遞歸遍歷 typedef struct BITREESTACKNODE {LinkNode node;BinaryNode* root;int flag; }BiTreeStackNode;//創建棧中結點 BiTreeStackNode* CreateBiTreeStackNode(BinaryNode* node, int flag) {BiTreeStackNode* newnode = (BiTreeStackNode*)malloc(sizeof(BiTreeStackNode));newnode->root = node;newnode->flag = flag;return newnode; }void NonRecursion(BinaryNode* root) {//創建棧LinkList *stack = Init_linkList();//把根結點扔到棧里Push_LinkList(stack, (LinkNode*)CreateBiTreeStackNode(root, MY_FALSAE));while (Size_LinkList(stack) > 0){//彈出棧頂元素BiTreeStackNode* node=(BiTreeStackNode*)Top_LinkList(stack);Pop_LinkList(stack);//判斷彈出的結點是否為空if (node->root == NULL){continue;}if (node->flag == MY_TRUE){printf("%c", node->root->ch);}//先序。放入順序和遍歷順序正好相反else {//當前結點的右結點入棧Push_LinkList(stack, (LinkNode*)CreateBiTreeStackNode(node->root->rchild, MY_FALSAE));//當前結點的左結點入棧Push_LinkList(stack, (LinkNode*)CreateBiTreeStackNode(node->root->lchild, MY_FALSAE));//當前結點入棧node->flag = MY_TRUE;Push_LinkList(stack, (LinkNode*)node);} } }//遍歷二叉樹 void Recursion(BinaryNode* root) {if (root == NULL) //退出條件return;//先序遍歷printf("%c", root->ch); //訪問根結點Recursion(root->lchild); //左子樹遍歷Recursion(root->rchild); //右子樹遍歷 }//二叉樹的非遞歸遍歷 void CreateBinaryTree() {/*A/ \B F\ \C G/ \ /D E H*///創建結點BinaryNode node1 = { 'A',NULL,NULL }; //字符需用'' 字符串用""BinaryNode node2 = { 'B',NULL,NULL };BinaryNode node3 = { 'C',NULL,NULL };BinaryNode node4 = { 'D',NULL,NULL };BinaryNode node5 = { 'E',NULL,NULL };BinaryNode node6 = { 'F',NULL,NULL };BinaryNode node7 = { 'G',NULL,NULL };BinaryNode node8 = { 'H',NULL,NULL };node1.lchild = &node2;node1.rchild = &node6;node2.lchild = &node3;node3.lchild = &node4;node3.rchild = &node5;node6.rchild = &node7;node7.lchild = &node8;//二叉樹的非遞歸遍歷NonRecursion(&node1); } int main() {CreateBinaryTree();return 0; }

?

運行結果:

總結

以上是生活随笔為你收集整理的数据结构-树2-二叉树各种函数实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。