辛星算法教程第一节即二叉树的递归遍历
我们都知道,二叉树的递归遍历可以分为三种:前序遍历、中序遍历和后序遍历,其实这三种遍历方式大同小异,由于都是使用递归实现的,因此也比较简单。
首先是tree.h文件,代码如下:
#ifndef TREE_H #define TREE_H #include <stdio.h> #include <malloc.h> #include <assert.h> typedef int ElemType; typedef struct Btree { ElemType val; struct Btree* left; struct Btree* right; }Btree, *Pbtree; #endif
然后是tree.c,代码如下:
#include <stdio.h> #include <stdlib.h> #include "tree.h" /** * 获取某个节点的值信息 * @param Pbtree pNode 节点对应的指针信息 * */ static void BtreeVisit(Pbtree pNode){ if (NULL != pNode){ printf("当前节点的值为: %d\n", pNode->val); } } /** * 构造一个tree节点,置左右指针为空,并且返回指向新节点的指针 * @param ElemType 值的类型 * @return Pbtree 指向新节点的指针 * */ static Pbtree BtreeMakeNode(ElemType target){ Pbtree pNode = (Pbtree) malloc(sizeof(Btree)); assert( NULL != pNode ); pNode->val = target; pNode->left = NULL; pNode->right = NULL; return pNode; } /** * 插入一个节点信息 * @param ElemType 要插入的数据 * @Param Pbtree* 指向某一个节点的指针 * @return Pbtree 指向新节点的指针 * */ Pbtree BtreeInsert(ElemType target, Pbtree* ppTree){ Pbtree pNode; assert( NULL != ppTree ); pNode = *ppTree; if (NULL == pNode){ return *ppTree = BtreeMakeNode(target); } //相同则不允许插入 if (pNode->val == target){ return NULL; }else if (pNode->val > target){ return BtreeInsert(target, &pNode->left); }else{ return BtreeInsert(target, &pNode->right); } } /** * 前序遍历这个树 * */ void BtreePreOrder(Pbtree pNode){ if (NULL != pNode){ BtreeVisit(pNode); BtreePreOrder(pNode->left); BtreePreOrder(pNode->right); } } int main(int argc, char *argv[]){ int i; int num[] = {21,43,2,6,88,9}; Pbtree root = NULL; for (i=0; i<sizeof(num)/sizeof(int); i++){ BtreeInsert(num[i], &root); } BtreePreOrder(root); return 0; }
这里我们的数据在插入的时候是进行了一定的区分的,如果这个数字比较小,则会插入到左边,如果大于该数字,则会插入到右边,我们最终插入的结构应该是这样的:
21
2 43
6 88
9
按照前序的输出顺序是:21 2 6 9 43 88
传播知识,传递温情。我心永恒,始终如一。 ----辛星