二叉树在数据结构当中我觉得是一个非常重要的基础数据类型,于是就重新复习一下吧,后面的二叉搜索树,平衡二叉树、红黑树、B树,B+树、哈夫曼树······都是以此为基础的。
然后我讲算法,基本都是用C语言,因为C语言算是比较底层的语言,我觉得用C语言写算法有一种独特的魅力,C语言算法都能写了,其他语言的算法不就是手到擒来嘛。
于是今天我就稍微手搓了一下二叉树的各种方法,构建了一个小小的二叉树,代码如下:
#include <stdio.h>
#include <stdlib.h>
//方便后续替换类型
typedef int eletype;
typedef struct TreeNode {
eletype data;
struct TreeNode *lefttree;
struct TreeNode *righttree;
}TreeNode;
//初始化节点
TreeNode* initNode(eletype e){
TreeNode* node = (TreeNode*)malloc(sizeof(TreeNode));
node->data=e;
node->lefttree=NULL;
node->righttree=NULL;
return node;
}
//获取节点数据
eletype getdata(TreeNode* targettree){
if(targettree == NULL){
return -1;
}
printf("Now data is %d",targettree->data);
return targettree->data;
}
//递归释放二叉树所有节点
void freeNode(TreeNode* targettree){
if(targettree == NULL) return; // 加判空
freeNode(targettree->lefttree); // 先释放子节点
freeNode(targettree->righttree);
free(targettree); // 最后释放根
}
//构建一个简单的二叉树
TreeNode* createTree(){
TreeNode* firstnode = initNode(1);
firstnode->lefttree=initNode(2);
firstnode->righttree=initNode(2);
return firstnode;
}
//二叉树先序遍历
void Preorder(TreeNode* node){
if(node == NULL) return;
getdata(node); // 先访问根
Preorder(node->lefttree); // 递归左子树
Preorder(node->righttree); // 递归右子树
}
//二叉树中序遍历
void Inorder(TreeNode* node){
if(node == NULL) return;
Inorder(node->lefttree); // 先递归左
getdata(node); // 再访问根
Inorder(node->righttree); // 再递归右
}
//二叉树后序遍历
void Postorder(TreeNode* node){
if(node == NULL) return;
Postorder(node->lefttree); // 先递归左
Postorder(node->righttree); // 再递归右
getdata(node); // 最后访问根
}
int main() {
TreeNode* root = createTree();
printf("Preorder: "); Preorder(root); printf("\n");
printf("Inorder: "); Inorder(root); printf("\n");
printf("Postorder: "); Postorder(root); printf("\n");
freeNode(root); // 释放
return 0;
}
当然现在构建的这个二叉树非常小,大家有兴趣可以自己实现大型的二叉树噢。
1
/ \
2 2