C语言- 基础数据结构和算法 - 11 12 二叉树实践_拷贝二叉树20220612
作者:互联网
12 二叉树实践_拷贝二叉树20220612,
听黑马程序员教程《基础数据结构和算法 (C版本)》,
照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1
喜欢的朋友可以去看看,欢迎大家一起交流学习。
二叉树的拷贝
12 二叉树实践_拷贝二叉树20220612.c
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 6 // 二叉树结点 7 typedef struct BINARYNODE{ 8 char ch; 9 struct BINARYNODE* lchild; // 左结点 10 struct BINARYNODE* rchild; // 右结点 11 }BinaryNode; 12 13 // 递归遍历 输出 14 void Recursion(BinaryNode* root,int D){ 15 16 if(root==NULL){ 17 return; 18 } 19 20 switch(D){ 21 22 case 1: // 先序遍历:D L R 23 24 // 先访问根结点 D 25 printf("%c ",root->ch); 26 // 再遍历左子树 L。左子树是“树”,有根的子结点,所以递归重头来。 27 Recursion(root->lchild,1); 28 // 再遍历右子树 R 29 Recursion(root->rchild,1); 30 break; 31 32 case 2: // 中序遍历:L D R 33 34 // 先访问左子数 L 35 Recursion(root->lchild,2); 36 // 再访问根结点 D 37 printf("%c ",root->ch); 38 // 再访问右子树 R 39 Recursion(root->rchild,2); 40 break; 41 42 case 3: // 后序遍历:L R D 43 44 // 先访问左子数 L 45 Recursion(root->lchild,3); 46 // 再访问右子树 R 47 Recursion(root->rchild,3); 48 // 再访问根结点 D 49 printf("%c ",root->ch); 50 break; 51 default: 52 break; 53 } 54 55 } 56 57 58 // 拷贝二叉树 59 BinaryNode* CopyBinaryTree(BinaryNode* root){ 60 61 if(root==NULL){ 62 return NULL; 63 } 64 65 // 拷贝左子树 66 BinaryNode* lchild = CopyBinaryTree(root->lchild); 67 // 拷贝右子树 68 BinaryNode* rchild = CopyBinaryTree(root->rchild); 69 70 // 创建当前结点 71 BinaryNode* newnode = (BinaryNode*)malloc(sizeof(BinaryNode)); 72 newnode->ch = root->ch; 73 newnode->lchild = lchild; 74 newnode->rchild = rchild; 75 76 return newnode; 77 } 78 79 // 递归释放内存 80 void FreeSpaceBinaryTree(BinaryNode* root){ 81 82 if(root==NULL){ 83 return; 84 } 85 86 // 释放左右子树 87 FreeSpaceBinaryTree(root->lchild); 88 FreeSpaceBinaryTree(root->rchild); 89 // 释放当前节点 90 free(root); 91 92 } 93 94 // 手动构建二叉树 95 void CresteBinaryTree(){ 96 // 共8个结点 97 BinaryNode nodeA = {'A',NULL,NULL}; 98 BinaryNode nodeB = {'B',NULL,NULL}; 99 BinaryNode nodeC = {'C',NULL,NULL}; 100 BinaryNode nodeD = {'D',NULL,NULL}; 101 BinaryNode nodeE = {'E',NULL,NULL}; 102 BinaryNode nodeF = {'F',NULL,NULL}; 103 BinaryNode nodeG = {'G',NULL,NULL}; 104 BinaryNode nodeH = {'H',NULL,NULL}; 105 //BinaryNode nodeI = {'I',NULL,NULL}; 106 //BinaryNode nodeJ = {'J',NULL,NULL}; 107 // 节点关系 108 nodeA.lchild = &nodeB; 109 nodeA.rchild = &nodeF; 110 nodeB.rchild = &nodeC; 111 nodeC.lchild = &nodeD; 112 nodeC.rchild = &nodeE; 113 nodeF.rchild = &nodeG; 114 nodeG.lchild = &nodeH; 115 // nodeH.lchild = &nodeI; 116 // nodeI.lchild = &nodeJ; 117 118 // 先序遍历 119 printf("\n先序遍历:"); 120 Recursion(&nodeA,1); 121 122 BinaryNode* root = CopyBinaryTree(&nodeA); 123 // 先序遍历 124 printf("\n\n拷贝新的树:"); 125 printf("\n先序遍历:"); 126 Recursion(root,1); 127 128 // 释放内存 129 FreeSpaceBinaryTree(root); 130 FreeSpaceBinaryTree(&nodeA); 131 132 } 133 134 135 int main(){ 136 printf("好好学习,天天向上~!!\t\t\t 12 二叉树实践_拷贝二叉树20220612\n\n\n"); 137 138 139 CresteBinaryTree(); 140 141 142 143 printf("\n\n\n"); 144 system("pause"); 145 146 return 0; 147 }
标签:11,lchild,20220612,BinaryNode,rchild,NULL,root,二叉树 来源: https://www.cnblogs.com/stou/p/16367737.html