数据结构之二叉树基础入门

3 阅读2分钟

二叉树在数据结构当中我觉得是一个非常重要的基础数据类型,于是就重新复习一下吧,后面的二叉搜索树,平衡二叉树、红黑树、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